2010-12-15 88 views
2

我有一个TreeView,并且每个TreeViewNode在它的Tag属性中都有一个对象。当树形视图中的节点被选中时,我想要一个DataGrid填充对象的所有字段的名称和值,通过反射获得。我无法弄清楚如何使用wpf databinding来做到这一点。关于如何使用简单方法绑定DataGrid的例子很少,我也使用了转换函数。如何将此数据绑定到DataGrid?

到目前为止我有什么是让我从一个单一的对象所需的数据的方法:

internal static IEnumerable<Tuple<string, object>> GetFieldInfo(object o) 
{ 
    return 
     from FieldInfo info in o.GetType().GetFields() 
     select Tuple.Create(info.Name, info.GetValue(o)); 
} 

,并在XAML TreeView和数据网格:

<TreeView Name="objectList" /> 
<DataGrid Name="objectData" /> 

我可以”找出正确的DataBinding咒语,通过GetFieldInfo方法获得((TreeViewNode)objectList.SelectedItem).Tag财产,并进入objectData.ItemsSource财产。

+0

你不应该使用反射的主/从细节接近 – 2010-12-15 15:01:04

+0

我需要列出对象的所有字段在标签中(对象可以是任意类型)和网格中的字段值。我没有用反射怎么做? – thecoop 2010-12-15 15:04:41

+0

几件事情...跳过Tag属性,因为它显着地耦合View,并通过TreeView.SelectedItem属性将数据绑定到您的VieWModel;一旦用户选择了一个新节点,您的DataGrid将通过ViewModel进行更新,而不是试图从Tag中提取数据。无论你想从模型中找到什么数据,我都会在模型本身上添加一些东西来返回值。也许在基类/接口中将其抽象出来(是的,你仍然需要反思,如你所说的那样) – 2010-12-15 15:16:38

回答

0

会是这样的帮助,Looking for an object graph tree-view control for WPF

否则,你可以结合所选树视图项目,像这样

<DataGrid Name="objectData" DataSource={Binding ElementName=objectList, Path=SelectedItem} /> 

如果你有某种形式的财产,你正在使用的对象TreeView就像某种Key/Value对象,比如ObjectProperty(字符串键,对象值),并且它暴露在名为ObjectProperties的集合中。然后,你可以绑定到你要的DataGrid,并让它自动生成的列和数据fror你

<DataGrid Name="objectData" DataSource={Binding ElementName=objectList, Path=SelectedItem.ObjectProperties} />