好的,再一次,我的Google-Fu不符合标准,我真的很感激这里的一点指导。
我有一个包含多个页面的WPF应用程序,其中一个包含一个TabControl,其中一个选项卡包含一个网格,其中一个列包含一个只有两个项目的StackPanel:一个Label和一个TreeView 。获取内容后,我无需更新TreeView。该应用程序使用MVVMLight(伟大的工具包!)来公开数据,并且所述数据应该在mvvm(可观察)属性中公开。我已经检查过,一旦设置了ItemsSource属性,数据本身就会以正确的形式提供,所以我知道这不是缺少数据或数据本身的结构。我查看了网上的所有条目(至少前4页值)与搜索词“wpf treeview dictionary”相匹配,所有文章都很接近,但是没有让我到达我需要的地方。我错过了什么,更糟糕的是,IntelliSense通过为xaml设置提供正确的值甚至“帮助”。所以我知道我很亲密,但经过两天的挫折之后,我正在扯皮并寻求帮助。
所以...问题的关键:TreeView需要显示的数据是SortedDictionary<string, List<ServerEntityNameMsSqlSvr>>
的形式。 ServerEntityNameMsSqlSvr类包含多个属性,其中一个属性为FullName。我希望TreeView显示的是字典Key作为父节点和List<ServerEntityNameMsSqlSvr>
中每个项目的FullName。你认为这很简单,不是吗?不适合我,我能得到的最接近的是显示字典的键,但是对于孩子们来说都没有(最好的情况)或抛出一个异常来阻止应用程序出现空例外(最坏的情况)。
这是我正在使用的xaml(最坏的情况):
<TreeView Grid.Column="0" ItemsSource="{Binding TableHierarchy}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Value}">
<TextBlock Text="{Binding Path=Key}"/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate DataType="awe:ServerEntityNameMsSqlSvr">
<TextBlock Text="{Binding FullName}"/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
“TableHierarchy”是公开数据的MVVM属性,它被声明为SortedDictionary<string, List<ServerEntityNameMsSqlSvr>>
。 DataType“awe:ServerEntityNameMsSqlSvr”是一个带有一些方法和属性的简单类,没什么特别的。一层继承,没有接口。在可用的属性中,我只想公开FullName,它被声明为公共字符串FullName =&gt; _全名();是的,它调用一个重载方法来构建全名,但结果是一个简单的字符串(并且在构建数据时发生方法调用,而不是显示时间,哇,值已经存在,至少调试到setter表明内容是正确的。
我研究过的一些解决方案建议将数据类型更改为字典以外的其他内容。在这种情况下,这是不可能的,并且鉴于列表有时相当大,我不想将其重建为其他东西。这需要使用声明的排序字典。
答案 0 :(得分:1)
上面显示的xaml确实是正确的,但是,支持数据的小工具(ServerEntityNameMsSqlServer类中的方法)在任何情况下都不需要抛出异常。在这种情况下,其中一个方法没有直接涉及作者的代码,而是在框架中的其他地方使用(重载调用“Equals”,构造为检查单个属性相等以确定结果)抛出了一个空异常,因为a特定用例没有填写财产。
很难找到,但这就是原因。