我使用下面的代码从数据网格中获取选中的项目,它工作得很好。
<Button Command="{Binding DeleteDataCommand}"
CommandParameter="{Binding ElementName=MyGridCtrl, Path=SelectedItems}"/>
现在我有一个命令,需要从2个数据格中选择2个列表。所以我尝试了以下多绑定:
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource MyMultiValueConverter}">
<Binding ElementName="grdDruckVersand" Path="SelectedItems"/>
<Binding ElementName="grdAusgabe" Path="SelectedItems"/>
</MultiBinding>
</Button.CommandParameter>
我的converter.Convert()
方法在初始化时被调用一次,但CommandParameter
总是null。也许我错过了什么…
编辑:grdDruckVersand和grdAusgabe是datagrid
<DataGrid x:Name="grdDruckVersand " ...
<DataGrid x:Name="grdAusgabe " ...
转换器:
public class MultiValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
好吧,从你的转换器的代码,这绝对不能工作。
你不能简单地写return Values;
,你需要做更多。
我同意这个:
public class MultiValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
// Caution: overdetailed code following:
var itemsToDeleteFromGrdDruckVersand = values[0]
var itemsToDeleteFromGrdAusgabe = values[1]
var itemsToDelete = itemsToDeleteFromGrdDruckVersand;
foreach (var item in itemsToDeleteFromGrdAusgabe)
{
itemsToDelete.Add(item);
}
// you can do a lot better with Linq if you want
return itemsToDelete;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
关键是你的commandParameters想要一个集合,而你给了他一个包含2个集合的集合。所以你需要把这两个集合合并成一个来让它工作。
为了好玩,下面是使用Linq: 的代码return ((Collection<object>)values[0]).Concat((Collection<object>)values[1]);
(您可能需要/想要将这里的2个"<object>
"替换为您的项目的实际类型)