我有DataGrid
绑定到ObservableCollection<MachineOrder>
,我想以编程方式添加一些列。
对象MachineOrder
包含另一个ObservableCollection<KeyValue>
,我想从中添加列。
问题是我想在ObservableCollection
中为每一行显示一个特定的密钥。索引并不总是一样,所以我不能使用它。
我试过这种方式:
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
有什么想法吗?
答案 0 :(得分:1)
如您所知,您只能绑定到属性。所以要解决这个问题,只需创建一个属性并绑定它即可。
首先,在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 + "\"]");
//...
}