0

我正在尝试制作一个TreeView使用ItemTemplate, 并且还绑定到具有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 和可视化。

但是,IsSelectedViewModel 上的属性 getter 永远不会被调用(永远不会遇到断点),所以很明显我在 IsSelected 属性的绑定上搞砸了一些东西。

我应该指出,当我运行应用程序时,我可以用鼠标选择项目,它们直观地反映了选择,因此 TreeView 项目本身被选中,它只是没有绑定到 ViewModel 的 IsSelected 属性。任何帮助将非常感激!

4

1 回答 1

0

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

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

我使用的是“ListBoxItem”而不是“TreeViewItem”。复制/粘贴对我来说是最好的。

于 2013-07-28T18:47:59.343 回答