【问题标题】:WPF with MVVM Add elements to a TreeView dynamically带有 MVVM 的 WPF 将元素动态添加到 TreeView
【发布时间】:2015-04-28 13:50:42
【问题描述】:

我正在用 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"

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

【问题讨论】:

  • 这是一个简洁的例子,说明它是如何完成的stackoverflow.com/a/28994128/1228你可以创建一个新项目并将代码粘贴进去,它就可以工作了。这样做,然后将其与您当前的项目进行比较,找出不同之处。
  • 你没有使用 ObservableCollection,可能是这个问题?
  • 您的 x:Type 问题——xmlns 是在 PresentationCore 中定义的。使用 Telerik 的 JustDecompile,加载 net 4.5 框架,然后单击列表中的 PresentationCore。您可以看到指向 System.Windows.Markup 的命名空间的 xmlnsdefinition。这是它的实现方式msdn.microsoft.com/en-us/library/ms753322(v=vs.110).aspx
  • @Will 谢谢你的例子,我会看看:-)。 x:Type 问题可能与我使用 .NET 4.0 有关。我会将项目更改为 4.5m,这可能是问题所在。
  • 不,您的 x:Type 问题(不清楚是什么问题)与版本无关。如果有的话,它应该“正常工作”。如果不是,您在引用、代码隐藏或 xaml 中搞砸了一些东西。创建一个新的 wpf 项目。在新项目中检查这三个中的每一个,并确保在你的项目中有等效项。

标签: c# wpf xaml mvvm treeview


【解决方案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
  • 您在&lt;TreeViewItem&gt; 中添加了&lt;TreeViewItem /&gt; 而不是&lt;TreeView&gt;
  • 您应该使用您的主集合绑定到TreeViewItemsSource,并使用每个元素内的集合绑定到HierarchicalDataTemplateItemsSource。例如,如果您有:

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

那么您应该在TreeView 中设置绑定到玩家列表,在HierarchicalDataTemplate 中设置绑定到团队列表。

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 2015-08-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2016-08-16
    • 2023-03-15
    相关资源
    最近更新 更多