WPF 绑定到数据网格的选定项

本文关键字:网格 数据网 绑定 数据 WPF | 更新日期: 2023-09-27 18:34:28

我有一个绑定到ObservableCollection<MyClass>的数据网格,我有另一个数据网格,它有两个DataGridTextColumns - Name和Value。"名称"列预填充了其值应显示在"值"列中的属性的名称。MyClass 实现了 INotifyPropertyChanged ,因此MyClass对象属性的任何更改都会更新第一个数据网格。现在,我想在第二个数据网格的"值"列中显示第一个数据网格的当前选定对象 (SelectedItem( 的属性,并查看属性更改,就像在第一个数据网格中一样。我怎样才能做到这一点?

如果您想知道原因,原始数据网格中仅显示一些属性,因此另一个属性应显示几乎所有属性。数据网格甚至是在 2 列中显示属性的好选择,还是我应该考虑其他控件?

WPF 绑定到数据网格的选定项

这听起来像是一个相当普遍的问题的一个方便的解决方案。

使用

两个数据网格执行此操作的最简单方法是使用一些隐藏和反射的代码。 首先定义一个类型以显示每个属性的名称和值:

class PropertyModel {
    private readonly string _name = "";
    private readonly object _value = null;

    public PropertyModel(string name, object value) {
       _name = name ?? "";
       _value = _value;
    }
    public string Name {
        get { return _name; }
    }
    public object Value {
        get { return _value; }
    }
}

然后将事件处理程序添加到代码隐藏,以处理第一个数据网格上的选择更改:

private void _onDataGrid1SelectionChanged(object sender, SelectedCellsChangedEventArgs e) {
   if (e.AddedCells.Count > 0) {
        var props = new Collection<PropertyModel>();
        var obj = _dataGrid1.SelectedItem;
        foreach(var prop in obj.GetType().GetProperties()) {
            props.Add(new PropertyModel(prop.Name, prop.GetValue(obj, null)));
        }

        _dataGrid2.ItemsSource = props;
   }
}

请注意,上面的代码非常粗糙,并且仅在 DataGrid1 将"选择模式"设置为"单"时才有效。 但是,这是一个很好的起点,如果您愿意快速而肮脏地(使用事件处理程序(执行此操作。

另一个很好的解决方案是使用行详细信息。这是一个关于使用行详细信息的非常好的介绍教程。当然,您还应该阅读有关该主题的 msdn 文章。