我正在使用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)。
我使用了以下资源:
(有人可以告诉我x:Type来自哪里?我的x命名空间中没有它可用,其定义如下:
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
我做错了什么?任何帮助表示赞赏。
答案 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}},并在每个元素中收集。例如,如果你有:
然后你应该在TreeView
到玩家列表和HierarchicalDataTemplate
到团队列表中设置绑定。