我在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实现转换器以根据条件选择绑定路径。任何其他建议也将不胜感激。
答案 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
属性绑定到值转换器。