我有一个绑定到ObservableCollection<MyClass>
的数据网格,我有另一个数据网格,它有两个DataGridTextColumns - Name和Value。 “名称”列预先填充了属性的名称,其值应显示在“值”列中。 MyClass实现INotifyPropertyChanged
,因此MyClass
对象属性的任何更改都会更新第一个数据网格。现在,我想在第二个数据网格的“值”列中显示第一个数据网格的当前所选对象(SelectedItem)的属性,并在发生时查看属性更改,就像在第一个数据网格中一样。我怎么能做到这一点?
如果您想知道原因,只有一些属性显示在原始数据网格中,因此另一个属性应该显示几乎所有属性。数据网格是否是在2列中显示属性的好选择,还是应该考虑其他控制?
答案 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。