我想在树视图中显示一些对象,但到目前为止还是没有成功。
我有ObservableCollection <ICustom>
个对象:Settings.ListOfCustomers
对象ICustom
:
int Id { get; }
int age { get; }
CustomerType CustomerType { get; }
ObservableCollection<IValue> ListOfValues { get; }
ObservableCollection<IValue> ListOfValues
还有一些属性,如:
String Name { get; }
我的观点:
<TreeView ItemsSource="{Binding ListOfCustomers, UpdateSourceTrigger=PropertyChanged}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type customerConfig:ICustomer}">
<TextBlock Text="{Binding Id}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type valueConfig:IValue}" ItemsSource="{Binding ListOfValues}">
<StackPanel>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
问题: 如何在TreeView中显示这些对象?我的方法(参见&#34;我的观点&#34;)不起作用。
答案 0 :(得分:3)
问题1:ObservableCollections
的优势在于,所有对视图的通知都是自动完成的。因此,您不必担心在集合中添加/删除对象的NotifyPropertyChanged
事件。
问题2:您的ViewModel
是DataContext
?我看不到有财产ObservableCollection<ICustomer>
的位置?您能否提供有关此类关系的更多详细信息?
编辑:
根据mm8的答案,x:Type属性应该是具体类型。所以代码看起来应该是这样的:
我建议你ObservableCollection<ICustomer> ListOfCustomers
中有ViewModel
,然后你可以在视图中绑定:
<TreeView ItemsSource="{Binding ListOfCustomers}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type Customer}">
<TextBlock Text="{Binding Id}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type modSettings:Value}"
ItemsSource="{Binding ListOfValues}">
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
我认为此主题为您的问题提供了更详细的解决方案:Implement WPF treeview with different Parent Nodes a well as different child nodes?
EDIT2:
我稍微更改了我的代码,以符合您的要求。这应该显示所有节点:
<TreeView ItemsSource="{Binding ListOfCustomers}" >
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=ListOfValues}" DataType="{x:Type Customer}">
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type modSettings:Value}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
<TextBlock Text="{Binding Path=Id}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
答案 1 :(得分:2)
我已将所有列表转换为
ObservableCollection
,也是嵌套列表。这是必要和正确的吗?
除非您打算在运行时动态地向集合添加项目,否则没有必要。然后,您需要使用ObservableCollection<T>
来自动显示TreeView
。或者你也可以使用List<T>
。
如何在
中显示这些对象TreeView
?
您收到错误消息是因为您将模板添加到Items
的{{1}}属性中。它们应添加到TreeView
属性中,即您需要添加Resources
元素。
您还应该阅读:
未应用<TreeView.Resources>
属性设置为接口类型的模板。因此,您应该为每种具体类型定义DataType
或使用HierarchicalDataTemplate
。