gpt4 book ai didi

基于对象类型和子类型的 WPF DataGrid 动态列

转载 作者:行者123 更新时间:2023-12-01 22:57:17 24 4
gpt4 key购买 nike

我正在构建一个 WPF 软件来管理电子元件库存。

我有以下结构:

public class Part
{
public string Manufacturer { get; set; }
public string PartNumber { get; set; }
}
public class Resistor : Part
{
public string Resistance { get; set;}
public string Power { get; set;}
}
public class Capacitor : Part
{
public string Capacitance { get; set; }
public string Voltage { get; set; }
}

Resistor 和 Capacitor 是 Part 的子类型。

我正在绑定(bind) DataGridObservableCollection<Part> ,并使用 ListCollectionView添加过滤和分组功能。

我想要完成的是当我过滤 ListCollectionView 时只得到 Resistor子类型,我想要 DataGrid更新它的列以显示 Resistor 的属性类型及其基类 Part (所以我会得到列 Manufacturer、PartNumber、Resistance 和 Power)。同时,如果我过滤 ListCollectionView得到Capacitor子类型,DataGrid应该有 Capacitor类公共(public)属性和 Part公共(public)属性(制造商、部件号、电容和电压)。最后,如果没有应用过滤,DataGrid只会显示 Part属性(制造商和零件编号)。

我尝试使用 AutoGenerateColumns=true但是 DataGrid只显示 Part属性,即使我过滤了 ListCollectionView只有Resistors .我还尝试更改 ObservableCollection 的类型至 dynamic而且它也没有用。

如何更改 DataGrid基于 ObservableCollection 中包含的对象类型的列?

最佳答案

这是一种方法。不要自动生成列。设置可能的每一列。然后将每列的可见性绑定(bind)到一个转换器,该转换器确定该列是否可见。

    <FrameworkElement x:Name="dummyElement" Visibility="Collapsed"/>
<DataGrid x:Name="dataGrid" ItemsSource="{Binding PartCollection}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Manufacturer" Binding="{Binding Manufacturer}"/>
<DataGridTextColumn Header="Part Number" Binding="{Binding PartNumber}" />
<DataGridTextColumn Header="Power" Binding="{Binding Power}" Visibility="{Binding DataContext.PartCollection, Source={x:Reference dummyElement}, Converter={StaticResource ColumnVisibility}, ConverterParameter=Resistor}"/>
<DataGridTextColumn Header="Resistance" Binding="{Binding Resistance}" Visibility="{Binding DataContext.PartCollection, Source={x:Reference dummyElement}, Converter={StaticResource ColumnVisibility}, ConverterParameter=Resistor}"/>
<DataGridTextColumn Header="Capacitance" Binding="{Binding Capacitance}" Visibility="{Binding DataContext.PartCollection, Source={x:Reference dummyElement}, Converter={StaticResource ColumnVisibility}, ConverterParameter=Capacitor}"/>
<DataGridTextColumn Header="Voltage" Binding="{Binding Voltage}" Visibility="{Binding DataContext.PartCollection, Source={x:Reference dummyElement}, Converter={StaticResource ColumnVisibility}, ConverterParameter=Capacitor}"/>
</DataGrid.Columns>
</DataGrid>

这里是转换器的静态资源...

<Window.Resources>
<local:ColumnVisibilityConverter x:Key="ColumnVisibility"/>
</Window.Resources>

这是转换器...

    public class ColumnVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
ObservableCollection<Part> collection = value as ObservableCollection<Part>;
string collectionType = parameter as string;
if(collection != null && collectionType != null && collection.Count > 0)
{
switch(collectionType)
{
case "Resistor": return collection[0].GetType() == typeof(Resistor) ? Visibility.Visible : Visibility.Hidden;
case "Capacitor": return collection[0].GetType() == typeof(Capacitor) ? Visibility.Visible : Visibility.Hidden;
default: return Visibility.Hidden;
}
}
return Visibility.Hidden;
}

我在绑定(bind)数据网格列的可见性方面遇到了一些困难。在这里找到答案:Binding Visibility for DataGridColumn in WPF

在我看来,手动设置列是最佳做法。如果你真的想自动生成它们,还有另一种方法可以做到这一点。您可以在集合上实现 ICustomTypeDescriptor,以返回集合中包含的派生类型的属性的 PropertyDescriptors。

关于基于对象类型和子类型的 WPF DataGrid 动态列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42516171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com