Wpf 当给定同一类的对象列表和属性字符串列表时,如何实现DataGrid?

Wpf 当给定同一类的对象列表和属性字符串列表时,如何实现DataGrid?,wpf,Wpf,我想实现一个DataGrid,它显示具有相同类的对象的数据。提供了一个名为objectsList的对象列表和一个名为propertiesToDisplay的属性字符串列表,用于接受类的泛型类型,以便DataGrid可以根据propertiesToDisplay选择要显示的对象属性。我如何实现它 主窗口 <Window x:Class="SomeProject.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006

我想实现一个DataGrid,它显示具有相同类的对象的数据。提供了一个名为
objectsList
的对象列表和一个名为
propertiesToDisplay
的属性字符串列表,用于接受类的泛型类型,以便DataGrid可以根据
propertiesToDisplay
选择要显示的对象属性。我如何实现它

主窗口

<Window x:Class="SomeProject.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SomeProject"
        mc:Ignorable="d"
        Title="MainWindow" MinHeight="450" MinWidth="700">
    <Grid>
        <DataGrid ItemsSource="{Binding ObjectsList}">
        <!-- Anything Else? -->
        </DataGrid>
    </Grid>
</Window>

视图模型

公共类视图模型
{
私有IList_对象列表;
公共IList对象列表
{
得到
{
返回对象列表;
}
设置
{
_objectsList=值;
}
}
私有IList_属性显示;
公共IList属性显示
{
得到
{
返回属性显示;
}
设置
{
_propertiesToDisplay=值;
}
}
//建造师
公共视图模型(IList对象列表、IList属性显示)
{
//请帮助我更正以下代码
PropertyInfo[]propertyInfos=null;
foreach(propertiesToDisplay中的变量propertyName)
{
propertyInfos=typeof(T).GetProperties();
var Name=propertyInfos.Select(x=>x.Name);
如果(!names.Contains(propertyName))
{
抛出新的ArgumentException(“”);
}
}
尝试
{
ObjectsList=ObjectsList;
foreach(objectsList中的var obj)
{
foreach(propertiesToDisplay中的变量propertyName)
{
PropertiesToDisplay.Add(propertyInfos.Where(x=>x.Name.Equals(propertyName)).FirstOrDefault().GetValue(obj,null.ToString());
}
}
}
捕获(例外情况除外)
{
}
}
}

您可以基于
属性显示
源属性在视图中动态创建列。大概是这样的:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        ViewModel<YourClass> viewModel = new ViewModel<YourClass>(..., ...);
        foreach (string column in viewModel.PropertiesToDisplay)
            dataGrid.Columns.Add(new DataGridTextColumn() { Header = column, Binding = new Binding(column) });
        dataGrid.AutoGenerateColumns = false;
        DataContext = viewModel;
    }
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
ViewModel ViewModel=新ViewModel(…,…);
foreach(viewModel.PropertiesToDisplay中的字符串列)
添加(新的DataGridTextColumn(){Header=column,Binding=newbinding(column)});
dataGrid.AutoGenerateColumns=false;
DataContext=viewModel;
}
}
XAML:

<DataGrid x:Name="dataGrid" ItemsSource="{Binding ObjectsList}" />


所有项的所有属性上嵌套的foreach循环毫无意义。您根本不需要PropertiesToDisplay列表。实际上,您需要的是从属性名列表中动态创建适当的DataGrid列。另外,不要忘记将视图模型的实例分配给主窗口的DataContext属性。这是否违反了MVVM?@TomFong:不,创建列不是视图或控件以外的任何其他组件的责任。您将在完全相同的视图中创建它们,就像您在XAML标记中直接定义它们一样。唯一的区别是您编写代码使其动态。在视图模型中创建列将打破这种模式。