Wpf 当给定同一类的对象列表和属性字符串列表时,如何实现DataGrid?
我想实现一个DataGrid,它显示具有相同类的对象的数据。提供了一个名为Wpf 当给定同一类的对象列表和属性字符串列表时,如何实现DataGrid?,wpf,Wpf,我想实现一个DataGrid,它显示具有相同类的对象的数据。提供了一个名为objectsList的对象列表和一个名为propertiesToDisplay的属性字符串列表,用于接受类的泛型类型,以便DataGrid可以根据propertiesToDisplay选择要显示的对象属性。我如何实现它 主窗口 <Window x:Class="SomeProject.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006
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标记中直接定义它们一样。唯一的区别是您编写代码使其动态。在视图模型中创建列将打破这种模式。