TreeView与嵌套列表

时间:2017-09-01 04:34:02

标签: c# wpf xaml treeview

我想在树视图中显示一些对象,但到目前为止还是没有成功。

我有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;)不起作用。

2 个答案:

答案 0 :(得分:3)

问题1:ObservableCollections的优势在于,所有对视图的通知都是自动完成的。因此,您不必担心在集合中添加/删除对象的NotifyPropertyChanged事件。

问题2:您的ViewModelDataContext?我看不到有财产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元素。

您还应该阅读:

Why can't a DataTemplate bind to an interface when that DataTemplate was explicitly returned from a DataTemplateSelector?

未应用<TreeView.Resources>属性设置为接口类型的模板。因此,您应该为每种具体类型定义DataType或使用HierarchicalDataTemplate