带有MVVM的WPF将元素动态添加到TreeView中



我正在用WPF做我的第一个更大的项目,也是用MVVM做的第一个项目。

我想用自定义类列表中的值填充TreeView。

XAML的部分看起来类似于以下内容:

<Window>
<StackPanel>
...
<TreeView>
<TreeViewItem>
<TreeViewItem />
<TreeViewItem.ItemTemplate>
<HierarchicalDataTemplate 
ItemsSource="{Binding ListOfFoo}">
<StackPanel>
<CheckBox VerticalAlignment="Center" Width="50" 
Content="{Binding Bar.Description}" IsChecked="{Binding IsChosen}"/>
<TextBox Width="38" VerticalAlignment="Center" 
Text="{Binding SomeText}" IsEnabled="{Binding IsChosen}" />  
</StackPanel>
</HierarchicalDataTemplate>
</TreeViewItem.ItemTemplate>
</TreeViewItem>
</TreeView>
...
</StackPanel>
</Window>

我的ViewModel中的属性如下:

public List<Foo> ListOfFoo
{ 
get { return listoffoo; }
set 
{ 
listoffoo = value; 
OnPropertyChanged("ListOfFoo");
}
}

Foo具有属性IsChosen、Bar(这是另一种具有属性Description的类型)和SomeText。

当我执行代码时,我可以看到TreeView中显示的第一个项目(其中有一些UI元素,我为了更好地阅读而省略了),但这些项目(在我的测试用例中应该是2)没有显示。

我使用了以下资源:

用mvvm 填充wpf树视图

(有人能告诉我x:Type来自哪里吗?我的x命名空间中没有这个,它的定义如下:

http://blogs.msdn.com/b/mikehillberg/archive/2009/10/30/treeview-and-hierarchicaldatatemplate-step-by-step.aspx

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

我做错了什么?感谢您的帮助。

我想你想要实现这样的目标:

<Window>
<StackPanel>
<TreeView ItemsSource="{Binding MainCollection}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding InnerCollection}">
<StackPanel>
<CheckBox VerticalAlignment="Center" Width="50" 
Content="{Binding Bar.Description}" IsChecked="{Binding IsChosen}"/>
<TextBox Width="38" VerticalAlignment="Center" 
Text="{Binding SomeText}" IsEnabled="{Binding IsChosen}" />  
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeViewItem />
</TreeView>
</StackPanel>
</Window>

你的错误:

  • 您为TreeViewItem设置了ItemTemplate,但您应该为TreeView设置ItemTemplate
  • 您在<TreeViewItem>中添加了<TreeViewItem />而不是<TreeView>
  • 您应该使用主集合绑定到TreeViewItemsSource,并使用每个元素内的集合绑定到HierarchicalDataTemplateItemsSource。例如,如果您有:

    • 玩家
      • 播放器1
        • 团队
          • 团队1
          • 第2组
      • 播放器2
        • 团队
          • 团队1
          • 第2组

则应在TreeView中设置绑定到球员列表,在HierarchicalDataTemplate中设置绑定至球队列表。

最新更新