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

TreeView: child node's VM being affected by parent selection

以下 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;

第一行将第二个文档的第一个子节点设置为 selected,而第二行将第一个文档节点设置为 select,但 将第二个文档的第一个子节点设置为 un select编辑。我确定我在那里使用的 DataTemplates 有问题,但无法弄清楚那是什么。

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

有很多方法可以解决这个问题 - 看看 this answer