多重绑定数据网格选定项不起作用



我使用下面的代码从数据网格中获取选中的项目,它工作得很好。

<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>"替换为您的项目的实际类型)

最新更新