WPF中的条件DataGrid多重绑定

时间:2019-05-14 15:45:16

标签: c# wpf multibinding

我在WPF窗口中有一个DataGrid,其itemSource可以根据条件而有所不同。如果条件为true,则itemsSource设置为classA类型的对象列表,否则设置为classB类型的对象列表。 在DatagridColumns中,我有一些DataGridTextColumn应该根据itemsSource的类型绑定到classA或classB的成员。

<DataGrid  x:Name="MyDataGrid">
    <DataGrid.Columns >
        <DataGridTextColumn Header="Title">
             <DataGridTextColumn.Binding>
                  <MultiBinding>
                       <Binding Path= "MemberOfClassA"/>
                       <Binding Path= "MemberOfClassB"/>
                 </MultiBinding>
             </DataGridTextColumn.Binding>
          </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

在我的C#代码中,我有:

ClassA
{
    public string MemberOfClassA {get;set;}
    ...
}
ClassB
{
    public string MemberOfClassB {get;set;}
    ...
}

List<ClassA> listA = ...;
List<ClassB> listB = ...;

MyDataGrid.ItemsSource = condtion? listA : listB;

如何为MultiBinding实现转换器以根据条件选择绑定路径。任何其他建议也将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果datagrid的列将不同,则更改列绑定将非常混乱。

您可以创建两个带有一个数据网格的用户控件。给您一个适合的数据网格。

将contentcontrol的内容切换为适当的内容。

通过使用datatemplateselector或将两个集合置于两种不同的viewmodel类型,然后使用datatype选择适当的用户控件作为数据模板。

答案 1 :(得分:1)

我发现此转换器有用:

 public class CellConverter : IMultiValueConverter
{
    public object Convert(
        object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        foreach(object value in values)
        {
            if (value == DependencyProperty.UnsetValue)
                continue;
            else
                return value;
        }
        return null;
    }       

    public object[] ConvertBack(
        object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }

}

以及XAML文件中的

<MultiBinding  Converter="{StaticResource CellConverter}">
     <Binding Path="MemberOfClassA"/>
     <Binding Path="MemberOfClassB"/>
</MultiBinding>

虽然ItemsSource仅设置为一种类型,但对于另一种类型,则不会设置值。因此返回值的类型将为DependencyProperty.UnsetValue,转换器将仅返回期望值。

修改

正如@EdPlunkett在评论中提到的那样,在这种方法中,值不能在DataGrid中进行编辑,因此仅对只读列有用。对于可编辑的列,最好为每种类型添加多个DataGridTextColumn并将其Visibility属性绑定到值转换器。