【问题标题】:LINQ in ItemBinding to add columns to DataGridItemBinding 中的 LINQ 将列添加到 DataGrid
【发布时间】:2015-11-16 06:50:41
【问题描述】:

我有一个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 的特征列表

有什么想法吗?

【问题讨论】:

  • 首先:你应该使用“Characteristics”,而不是“Charakteristics”(c 不是 k)。虽然它不能解决你的问题。

标签: c# wpf linq datagrid


【解决方案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 + "\"]");
    //...
}

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多