如何在TreeView上使用ItemTemplate时以样式对IsSelected进行数据绑定

本文关键字:样式 IsSelected 数据绑定 ItemTemplate TreeView | 更新日期: 2023-09-27 18:25:11

我正在尝试制作一个使用ItemTemplateTreeView,它还绑定到一个具有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上使用ItemTemplate时以样式对IsSelected进行数据绑定

啊,我真傻!我花了很长时间试图弄清楚它是什么,几个小时后来到这里,然后终于弄清楚了:

  <TreeView.ItemContainerStyle>
      <Style TargetType="TreeViewItem">
          <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
      </Style>
  </TreeView.ItemContainerStyle>

我使用的是"ListBoxItem"而不是"TreeViewItem"。复制/粘贴占了上风。