TreeView:子节点的VM受父选择影响

时间:2018-11-16 14:02:06

标签: wpf mvvm treeview datatemplate

以下TreeView设置有什么问题?设置父节点VM的selected属性会切换子节点的selected属性。

<TreeView ItemsSource="{Binding Documents}">
  <TreeView.ItemContainerStyle>
    <Style TargetType="TreeViewItem">
      <Setter Property="IsExpanded" Value="True" />
      <Setter Property="IsSelected" Value="{Binding selected}" />
    </Style>
  </TreeView.ItemContainerStyle>

  <TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding descriptions}">
      <HierarchicalDataTemplate.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
          <Setter Property="IsSelected" Value="{Binding selected}" />
        </Style>
      </HierarchicalDataTemplate.ItemContainerStyle>
      <HierarchicalDataTemplate.ItemTemplate>
        <DataTemplate>
          <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding name}" />
          </StackPanel>
        </DataTemplate>
      </HierarchicalDataTemplate.ItemTemplate>
        <TextBlock Text="{Binding name}" />
      </StackPanel>
    </HierarchicalDataTemplate>
  </TreeView.ItemTemplate>
</TreeView>

VM对象如下所示:

public class DocumentVM : ObservableObject
{
    private string _name;
    public string name
    {
      get { return _name; }
      set { Set(ref _name, value); }
    }

    private bool _selected = false;
    public bool selected
    {
      get { return _selected; }
      set { Set(ref _selected, value); }
    }
}

DescriptionVM非常相似。

例如,如果我运行以下两行:

MyVM.Documents[1].descriptions[0].selected = true;
MyVM.Documents[1].selected = true;

第一行将第二个文档的第一个子节点设置为选中状态,而第二行将第二个文档的第一个子节点设置为选中状态,但将第二个文档的第一个子节点设置为未选中状态。我确定这是我在这里使用的DataTemplates的问题,但无法弄清楚那是什么。

1 个答案:

答案 0 :(得分:0)

默认情况下,WPF TreeView不支持多项选择,因此第二项选择将自动取消选择第一项。

有多种方法可以解决-看this answer