WPF的树形视图(ItemTemplate)和项模板选择器(ItemTemplateSelector)被忽略了。

4

在我的应用程序中,每次树形视图加载其项目时都会出现此错误。这个错误使我的应用程序加载缓慢,需要至少两分钟才能加载。

错误是:System.Windows.Data Error: 26 : ItemTemplate and ItemTemplateSelector are ignored for items already of the ItemsControl's container type; Type='TreeViewItem'

我的树形视图的XAML代码如下:(我在ViewModel上使用VB.net)

<TreeView ScrollViewer.VerticalScrollBarVisibility="Hidden" 
          ItemContainerStyle="{DynamicResource tviStyle}" 
          Background="#FFF0F0F0" BorderBrush="#FFE5E2DB" 
          IsEnabled="{Binding isTreeEnable}" 
          ItemsSource="{Binding PostcodeLijst}" 
          Margin="0" Name="dgStamOverzichtPostcode" />

ItemsSource的绑定是一个ObservableCollection(Of TreeViewItem),它从数据库中填充。

我已经在谷歌上搜索了答案,但到目前为止我还没有找到!有人知道如何修复这个问题吗?

提前感谢任何帮助。

2个回答

4
您正在绑定已经是UI元素的元素(这里是TreeViewItems)。通常情况下,您将任何对象绑定到itemsSource中,然后ItemsContainerGenerator为每个绑定的项创建TreeViewItems。
在您的情况下无法执行此操作,因为您已经有了TreeViewItems,因此无法应用模板,这就是为什么会出现此错误消息的原因。
您可以通过以下方式解决它:
a)将DataObjects绑定到您的Tree上,而不是TreeViewItems,它们将自动创建
b)直接将样式分配给您已经拥有的treeviewItems
还可以参见link

关于A选项,你是让我将属性PostcodeLijst从ObservableCollection(of TreeViewItem)更改为其他东西吗?!我不太明白 :P - Rui
我的意思是PostcodeLijst不应该是一个ObservableCollection<TreeViewItem>,而应该是一个简单的数据表示,例如ObservableCollection<string>。在您当前的实现中,您的ViewModel知道PostCodes显示为TreeViewItems。但这不是它的工作(顺便说一下,这也不像MVVM)。如果您想将树更改为其他内容,例如ListView,该怎么办?我建议的选项a)与用户“Andy”在他的帖子中已经提出的建议完全相同,我非常赞同。 - SvenG

4

不要在您的视图模型中创建TreeViewItems列表,而是创建一个对象列表,仅描述您要显示的数据,即使它很简单

class Item
{
   public string Header { get;set; }
}

TreeViewItem已经有与之关联的模板。


2
我同意Andy的观点,看看这篇文章 - 通过使用ViewModel模式简化WPF TreeView - akjoshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接