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