1

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

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

4

1 回答 1

2

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

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

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 将 SelectionMode 设置为 Single 时才有效。但是,如果您愿意快速而肮脏地(使用事件处理程序),那么这是一个很好的起点。

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

于 2012-05-16T00:03:20.143 回答