带有 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命名空间里没有,定义如下:
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>
您应该将主集合绑定到 TreeView
的 ItemsSource
,并在每个元素内将集合绑定到 HierarchicalDataTemplate
的 ItemsSource
。例如,如果您有:
- 玩家
- 玩家1
- 团队
- 团队 1
- 第 2 队
- 玩家2
- 团队
- 团队 1
- 第 2 队
那么你应该在 TreeView
中设置绑定到玩家列表,在 HierarchicalDataTemplate
中设置绑定到团队列表。
我正在用 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命名空间里没有,定义如下:
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
设置 - 您在
<TreeViewItem>
中添加了<TreeViewItem />
而不是<TreeView>
您应该将主集合绑定到
TreeView
的ItemsSource
,并在每个元素内将集合绑定到HierarchicalDataTemplate
的ItemsSource
。例如,如果您有:- 玩家
- 玩家1
- 团队
- 团队 1
- 第 2 队
- 团队
- 玩家2
- 团队
- 团队 1
- 第 2 队
- 团队
- 玩家1
- 玩家
ItemTemplate
那么你应该在 TreeView
中设置绑定到玩家列表,在 HierarchicalDataTemplate
中设置绑定到团队列表。