ItemBinding中的LINQ将列添加到DataGrid

时间:2015-11-16 06:50:41

标签: c# wpf linq datagrid

我有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

的特征列表

有什么想法吗?

1 个答案:

答案 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 + "\"]");
    //...
}