2012-05-15 132 views
1

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

如果你想知道原因,只有一些属性都显示在数据网格原,所以对方应该显示几乎所有的人。 DataGrid甚至是显示2列中属性的好选择,还是应该考虑其他控件?

回答

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

+0

感谢迈克尔,你的代码是非常有益的。它也适用于DataGridSelecionMode设置为Extended,因为SelectedItem属性获取当前Selection中的第一个元素,这正是我所需要的。 – marko