WPF 中的条件 DataGrid 多重绑定
Conditional DataGrid MultiBinding in WPF
我在 WPF window 中有一个 DataGrid,其 itemsSource 可能会因条件而异。如果条件为真,则 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 到 select 基于条件的绑定路径的转换器。任何替代建议也将不胜感激。
如果数据网格的列不同,则更改列绑定会很麻烦。
您可以创建两个用户控件,每个控件都有一个数据网格。给你一个适合每个人的数据网格。
将内容控件的内容切换到适当的内容。
通过使用数据模板select或者将您的两个集合放入两种不同的视图模型类型中并使用数据类型 select 适当的用户控件作为数据模板。
我发现这个转换器很有用:
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 仅设置为其中一种类型,但不会为另一种类型设置值。所以 return 值将是 DependencyProperty.UnsetValue 类型,转换器只是 return 预期值。
编辑
正如@EdPlunkett 在评论中提到的那样,在此方法中无法在 DataGrid 中编辑值,因此它仅对只读列有用。对于可编辑列,最好为每种类型添加多个 DataGridTextColumn 并将它们的 Visibility
属性 绑定到值转换器。
我在 WPF window 中有一个 DataGrid,其 itemsSource 可能会因条件而异。如果条件为真,则 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 到 select 基于条件的绑定路径的转换器。任何替代建议也将不胜感激。
如果数据网格的列不同,则更改列绑定会很麻烦。
您可以创建两个用户控件,每个控件都有一个数据网格。给你一个适合每个人的数据网格。
将内容控件的内容切换到适当的内容。
通过使用数据模板select或者将您的两个集合放入两种不同的视图模型类型中并使用数据类型 select 适当的用户控件作为数据模板。
我发现这个转换器很有用:
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 仅设置为其中一种类型,但不会为另一种类型设置值。所以 return 值将是 DependencyProperty.UnsetValue 类型,转换器只是 return 预期值。
编辑
正如@EdPlunkett 在评论中提到的那样,在此方法中无法在 DataGrid 中编辑值,因此它仅对只读列有用。对于可编辑列,最好为每种类型添加多个 DataGridTextColumn 并将它们的 Visibility
属性 绑定到值转换器。