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

WPF with MVVM Add elements to a TreeView dynamically

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

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

我的 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(这是另一种具有 属性 描述的类型)和 SomeText。

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

我使用了以下资源:

Fill wpf treeview with mvvm

(谁能告诉我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 中设置绑定到团队列表。