如何在 WPF 中将字段绑定到 DataGrid?
How to bind Fields to DataGrid in WPF?
我正在 UI 使用 WPF 编程一个月。所以我是这个世界上的新人。这是我第一次 post 来这里,我的母语不是英语。所以如果我写的有什么错误,请见谅。
我有一个 WPF 问题,我找不到解决方案。我正在尝试在 WPF 中制作完全可自定义的 DataGrid,但我不希望 DataGrid 自动创建列或行。
我有一个名为 Sinif_Tutucu
的 ObservableCollection
(在我的母语中意思是 Class_Holder),它包含 类。这些 类 具有相同的 Field 和 Properties,但它们的值不同。我正在根据这些 类 中的字段和属性一一创建列。在此之后,我手动将列添加到 DataGrid。
然后我像这样添加带有 ItemsSource
的行。
DataGrid_1.ItemsSource = Sinif_Tutucu;
这仅填充 DataGrid 中的属性,由字段组成的列保持为空。我搜索过这个,我想没有办法将字段绑定到 DataGrid。 Sinif_Tutucu
中的 类 有数千个字段。所以我无法将字段转换为属性,也不想从头开始编写整个数据网格结构。因为 WPF DataGrid 结构提供了许多我目前正在使用的有用功能。我能够获取字段名称及其值或 属性 名称和值。我只需要自己创建每一行(如列)并用 C# 手动填充它们的单元格。或者我需要以某种方式将这些字段以编程方式转换为属性。有什么办法可以实现吗?
假设您要在数据网格中显示的 class 如下所示
public class Data
{
public int Value;
public string Name;
public DateTime Date = DateTime.Now;
}
因为您不能将字段绑定到 DataGridColumns
,所以您必须动态创建列和记录。这是一个简短的片段,您可以使用它来做到这一点。此方法在 List
中创建新的 dynamic
对象,它存储与 ObservableCollection
中相同的数据。此 List
被设置为您的 DataGrid
的新 ItemSource
。此代码段仅创建 DataGridTextColumns
。如果要使用其他 DataGridColumns
.
,您可能必须修改此解决方案
private void loadDataGrid()
{
List<dynamic> dataObjects = new List<dynamic>();
dynamic dataObject;
IDictionary<string, object> dataObjectValues;
var fields = typeof(Data).GetFields();
foreach (var item in Sinif_Tutucu)
{
dataObject = new System.Dynamic.ExpandoObject();
foreach (var field in fields)
{
dataObjectValues = (IDictionary<string, object>)dataObject;
dataObjectValues[field.Name] = field.GetValue(item);
}
dataObjects.Add(dataObject);
}
dataObjectValues = (IDictionary<string, object>)dataObjects[0];
foreach (var pair in dataObjectValues)
{
var binding = new Binding(pair.Key);
DataGridTextColumn col = new DataGridTextColumn() { Binding = binding, Header = pair.Key }; //You might want to use another DataGridColumn-Type
dataGrid.Columns.Add(col);
}
dataGrid.ItemsSource = dataObjects;
}
我正在 UI 使用 WPF 编程一个月。所以我是这个世界上的新人。这是我第一次 post 来这里,我的母语不是英语。所以如果我写的有什么错误,请见谅。
我有一个 WPF 问题,我找不到解决方案。我正在尝试在 WPF 中制作完全可自定义的 DataGrid,但我不希望 DataGrid 自动创建列或行。
我有一个名为 Sinif_Tutucu
的 ObservableCollection
(在我的母语中意思是 Class_Holder),它包含 类。这些 类 具有相同的 Field 和 Properties,但它们的值不同。我正在根据这些 类 中的字段和属性一一创建列。在此之后,我手动将列添加到 DataGrid。
然后我像这样添加带有 ItemsSource
的行。
DataGrid_1.ItemsSource = Sinif_Tutucu;
这仅填充 DataGrid 中的属性,由字段组成的列保持为空。我搜索过这个,我想没有办法将字段绑定到 DataGrid。 Sinif_Tutucu
中的 类 有数千个字段。所以我无法将字段转换为属性,也不想从头开始编写整个数据网格结构。因为 WPF DataGrid 结构提供了许多我目前正在使用的有用功能。我能够获取字段名称及其值或 属性 名称和值。我只需要自己创建每一行(如列)并用 C# 手动填充它们的单元格。或者我需要以某种方式将这些字段以编程方式转换为属性。有什么办法可以实现吗?
假设您要在数据网格中显示的 class 如下所示
public class Data
{
public int Value;
public string Name;
public DateTime Date = DateTime.Now;
}
因为您不能将字段绑定到 DataGridColumns
,所以您必须动态创建列和记录。这是一个简短的片段,您可以使用它来做到这一点。此方法在 List
中创建新的 dynamic
对象,它存储与 ObservableCollection
中相同的数据。此 List
被设置为您的 DataGrid
的新 ItemSource
。此代码段仅创建 DataGridTextColumns
。如果要使用其他 DataGridColumns
.
private void loadDataGrid()
{
List<dynamic> dataObjects = new List<dynamic>();
dynamic dataObject;
IDictionary<string, object> dataObjectValues;
var fields = typeof(Data).GetFields();
foreach (var item in Sinif_Tutucu)
{
dataObject = new System.Dynamic.ExpandoObject();
foreach (var field in fields)
{
dataObjectValues = (IDictionary<string, object>)dataObject;
dataObjectValues[field.Name] = field.GetValue(item);
}
dataObjects.Add(dataObject);
}
dataObjectValues = (IDictionary<string, object>)dataObjects[0];
foreach (var pair in dataObjectValues)
{
var binding = new Binding(pair.Key);
DataGridTextColumn col = new DataGridTextColumn() { Binding = binding, Header = pair.Key }; //You might want to use another DataGridColumn-Type
dataGrid.Columns.Add(col);
}
dataGrid.ItemsSource = dataObjects;
}