在ItemBinding中使用LINQ将列添加到DataGrid
本文关键字:添加 DataGrid LINQ ItemBinding | 更新日期: 2023-09-27 18:22:05
我有一个绑定到ObservableCollection<MachineOrder>
的DataGrid
,我想在其中以编程方式添加一些列。
对象MachineOrder
包含另一个ObservableCollection<KeyValue>
,我想从中添加列。
问题是,我想在ObservableCollection
中为每一行显示一个特定的Key。索引并不总是一样的,所以我不能用它。
我是这样尝试的:
foreach (StringWrapper characteristic in viewModel.Characteristics)
{
Binding binding = new Binding();
binding.FallbackValue = "kein Wert";
binding.Path = new PropertyPath("Charakteristics.FirstOrDefault(x => x.Key == characteristic.Value).Value");
DataGridTextColumn columnActive = new DataGridTextColumn();
columnActive.Header = characteristic.Value;
columnActive.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
columnActive.Binding = binding;
}
但是linq表达式在这里不起作用。顺便说一句:viewModel.Characteristics
包含我想添加到DataGrid
中的特性列表
有什么想法吗?
正如您所知,您只能绑定到属性。所以要解决这个问题,只需创建一个属性并绑定它
首先,在ObservableCollection<KeyValue>
上创建一个要在MachineOrder
类中使用的自定义派生集合。
public class KeyValueCollection : ObservableCollection<KeyValue>
{
public Value this[string key]
{
get
{
var item = this.FirstOrDefault(x => x.Key == key);
return item != null ? item.Value : null;
}
}
}
整个目的是通过键定义一个新的索引器属性。请注意,我没有您的KeyValue
类,所以返回类型会有所不同。
然后你可以像这个一样绑定到该属性
foreach (StringWrapper characteristic in viewModel.Characteristics)
{
// ...
binding.Path = new PropertyPath("Characteristics['"" + characteristic.Value + "'"]");
//...
}