multibinding datagrid selecteditems不起作用

时间:2011-04-11 11:46:40

标签: .net wpf datagrid .net-4.0 multibinding

我使用以下内容从数据网格中获取选定项目,并且工作正常。

<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是DataGrids

 <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();
    }

}

1 个答案:

答案 0 :(得分:2)

好吧,从转换器的代码来看,这绝对不行。

你不能简单地写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>