如何在TreeView上使用ItemTemplate时以样式对IsSelected进行数据绑定
本文关键字:样式 IsSelected 数据绑定 ItemTemplate TreeView | 更新日期: 2023-09-27 18:25:11
我正在尝试制作一个使用ItemTemplate
的TreeView
,它还绑定到一个具有IsSelected
属性的视图模型。
我不太清楚为什么这不起作用,所以如果这个问题看起来很模糊,我道歉。
我还将代码简化为我认为的问题,因为我的应用程序有更多的XAML
,所以我希望我包含的内容足够了。
以下是我如何定义我的DataTemplate:
<DataTemplate x:Key="ElementDataTemplate">
<Label Content="{Binding Path=DisplayText}"></Label>
</DataTemplate>
以下是我的使用方法:
<TreeView ItemsSource="{Binding Elements}"
ItemTemplate="{DynamicResource ElementDataTemplate}">
<TreeView.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected"
Value="{Binding Path=IsSelected, Mode=TwoWay}" />
</Style>
</TreeView.Resources>
</TreeView>
我的ViewModel具有DisplayText和IsSelected属性。
我知道我正确地绑定到了ViewModel,因为我看到的项目数量与我的数据上下文的Elements属性中的项目数量相同,并且我的Label的Coutent被正确地设置为DisplayText——我已经通过getter上的断点和运行应用程序时的视觉验证了这一点。
但是,ViewModel上的IsSelected
属性的getter从未被调用(从未遇到断点),所以很明显,我在IsSelected属性的绑定上搞砸了一些东西。
我应该指出,当我运行应用程序时,我可以用鼠标选择项目,它们可以直观地反映选择,因此TreeView项目本身被选中,它只是没有绑定到ViewModel的IsSelected属性。任何帮助都将不胜感激!
啊,我真傻!我花了很长时间试图弄清楚它是什么,几个小时后来到这里,然后终于弄清楚了:
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
</Style>
</TreeView.ItemContainerStyle>
我使用的是"ListBoxItem"而不是"TreeViewItem"。复制/粘贴占了上风。