在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 中的特性列表

有什么想法吗?

在ItemBinding中使用LINQ将列添加到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 + "'"]");
    //...
}