带MVVM的WPF动态地向TreeView添加元素

时间:2015-04-28 13:50:43

标签: c# wpf xaml mvvm 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)。

我使用了以下资源:

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"

我做错了什么?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

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

<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>

你的错误:

  • 您为ItemTemplate设置TreeViewItem,但您应为ItemTemplate
  • 设置TreeView
  • 您在<TreeViewItem />内添加了<TreeViewItem>而非<TreeView>
  • 您应该将ItemsSource TreeView与您的主要收藏集绑定到ItemsSource HierarchicalDataTemplate的{​​{1}},并在每个元素中收集。例如,如果你有:

    • 玩家
      • 玩家1
        • 团队
          • 第1队
          • 第2队
      • 玩家2
        • 团队
          • 第1队
          • 第2队

然后你应该在TreeView到玩家列表和HierarchicalDataTemplate到团队列表中设置绑定。