WPF DataGrid ItemsSource许多类

w51jfk4q  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(141)

我有很多这样的课:

public  class ClassA
{
    public decimal ID_A { get; set; } = 0;
    public string MyProperty1 { get; set; } = "";
    public string MyProperty2 { get; set; } = "";
}

public class ClassB
{
    public decimal ID_B { get; set; } = 0;
    public string MyProperty1 { get; set; } = "";
    public string MyProperty2 { get; set; } = "";
    public string MyProperty3 { get; set; } = "";
}

这些类应该显示在DataGrid中。对于测试,我只是添加了一个包含两个按钮的窗口。第一部分包括:

List<ClassA> a = new List<ClassA>()
{
    new ClassA { ID_A = 1, MyProperty1 = "Ap1", MyProperty2 = "p1"} ,
    new ClassA { ID_A = 2, MyProperty1 = "Ap2", MyProperty2 = "p2"}

};
ListaDanych FLista = new ListaDanych(a);
FLista.Show();

第二个:

List<ClassB> b = new List<ClassB>()
{
    new ClassB { ID_B = 1, MyProperty1 = "Bp1", MyProperty2 = "p1", MyProperty3 = "3"} ,
    new ClassB { ID_B = 2, MyProperty1 = "Bp2", MyProperty2 = "p2", MyProperty3 = "3"}
};
ListaDanych FLista = new ListaDanych(b);
FLista.Show();

这两个按钮只是生成带有测试数据的列表并运行我的第二个窗口。
在第二个窗口中,我只是为每个类添加一个构造函数:

private List<ClassA> _MojeDaneA;
private List<ClassB> _MojeDaneB;

public ListaDanych(List<ClassA> ListaDanych)
{
    _MojeDaneA = ListaDanych;
    InitializeComponent();
    DGDane.ItemsSource = ListaDanych;
}

public ListaDanych(List<ClassB> ListaDanych)
{
    _MojeDaneB = ListaDanych;
    InitializeComponent();
    DGDane.ItemsSource = ListaDanych;
}

但是我可以用更通用的方式来做这件事吗?只为所有现有的类添加一个构造函数?
第二个问题:如何根据构造函数中传递的类类型为DataGrid添加自定义头?

s3fp2yjn

s3fp2yjn1#

对象不工作,但IELTS正在工作。
这是我现在的代码:

public ListaDanych(Type Typ, IEnumerable ListaDanych) 
{
    InitializeComponent();
    
    if(Typ == typeof(ClassA))
    {
        UCDataGrid_A uCDataGrid_A = new UCDataGrid_A();
        Siatka.Children.Add(uCDataGrid_A);
        uCDataGrid_A.Dane.ItemsSource = ListaDanych;
    }
    if (Typ == typeof(ClassB))
    {
        UCDataGrid_B uCDataGrid_B = new UCDataGrid_B();
        Siatka.Children.Add(uCDataGrid_B);
        uCDataGrid_B.Dane.ItemsSource = ListaDanych;
    } 
}

UCDataGrid_A只是自定义控件。它包含:

<UserControl x:Class="WPFTest.Klasy.UCDataGrid_A"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WPFTest.Klasy"
             mc:Ignorable="d" 
             HorizontalAlignment="Stretch" VerticalAlignment="Stretch" d:DesignHeight="261.292" d:DesignWidth="654.832">            

        <DataGrid AutoGenerateColumns="False" Name="Dane">
            <DataGrid.Columns>
                <DataGridCheckBoxColumn Binding="{Binding OK}" Header="OK" Width="100"/>
                <DataGridTextColumn Binding="{Binding ID_A}" Header="ID" Width="100"/>
                <DataGridTextColumn Binding="{Binding MyProperty1}" Header="Prop 1" Width="*"/>
                <DataGridTextColumn Binding="{Binding MyProperty2}" Header="Prop 2" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>

</UserControl>

我不知道这是不是最好的方法,但它很有效。
对我来说,它有两个好处:
1.我可以看到我的DataGrid是什么样子
1.我可以在一个单独的文件中为每个类定义

ivqmmu1c

ivqmmu1c2#

下面是ListaDanych窗口中更通用的构造函数和自定义头的代码:

public partial class ListaDanych : Window
{
    private object _dataSource;

    public ListaDanych(object dataSource)
    {
        _dataSource = dataSource;
        InitializeComponent();
        DGDane.ItemsSource = _dataSource;

        SetHeaders();
    }

    private void SetHeaders()
    {
        if (_dataSource is List<ClassA>)
        {
            DGDane.Columns[0].Header = "ID_A";
            DGDane.Columns[1].Header = "MyProperty1";
            DGDane.Columns[2].Header = "MyProperty2";
        }
        else if (_dataSource is List<ClassB>)
        {
            DGDane.Columns[0].Header = "ID_B";
            DGDane.Columns[1].Header = "MyProperty1";
            DGDane.Columns[2].Header = "MyProperty2";
            DGDane.Columns[3].Header = "MyProperty3";
        }
    }
}

在这段代码中,有一个接受object参数的构造函数。根据对象的类型,它为DataGrid设置数据源,并相应地定制列标题。SetHeaders方法检查数据源的类型,并根据类型分配头。
请记住根据类的属性调整列索引和标题名称。这种方法避免了为每个类构造函数重复代码,并提供了一个更通用的解决方案。

相关问题