在TreeView上使用ItemTemplate时如何在样式中选择数据绑定IsSelected

时间:2013-07-28 18:38:33

标签: c# wpf xaml data-binding treeview

我尝试制作使用TreeView的{​​{1}},并且还绑定到具有ItemTemplate属性的视图模型。

我不确定为什么这不起作用,所以如果问题看起来含糊不清,我会道歉。

我还将代码缩减到我认为的问题,因为我的应用程序有更多IsSelected,所以我希望我所包含的内容已足够。

以下是我定义DataTemplate的方法:

XAML

以下是我如何使用它:

    <DataTemplate x:Key="ElementDataTemplate">
        <Label Content="{Binding Path=DisplayText}"></Label>
    </DataTemplate>

我的ViewModel具有DisplayText和IsSelected属性。

我知道我正确地绑定到ViewModel,因为我看到与我的数据上下文的Elements属性中相同数量的项目,并且我的Label的Coutent正确地设置为DisplayText-当我运行应用程序时,我已通过getter上的断点验证了这一点。

然而,ViewModel上的 <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> 属性的getter永远不会被调用(永远不会遇到断点),所以很明显我搞砸了绑定的东西。被选中的财产。

我应该指出,当我运行应用程序时,我可以使用鼠标选择项目并且它们可视地反映选择,因此TreeView项目本身被选中,它只是不绑定到ViewModel&#39; s IsSelected属性。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

啊,我很蠢!我花了很长时间试图找出它是什么,几个小时后来到这里,然后终于弄明白了:

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

我使用“ListBoxItem”而不是“TreeViewItem”。复制/粘贴得到了我的好处。