WPF绑定到datagrid的SelectedItem

时间:2012-05-15 23:24:56

标签: c# wpf binding datagrid

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

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

1 个答案:

答案 0 :(得分: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时才能使用。但是,如果你愿意快速和肮脏(使用事件处理程序),这是一个很好的起点。

另一个很好的解决方案是使用行详细信息。 This is a pretty good intro tutorial on using row details。 当然,您还应该阅读msdn article on the subject