我使用MVVM绑定到树。我以一种看似相当标准的方式执行此操作,即树中的每个节点对象都支持ITreeNode接口:
public interface ITreeNode
{
bool IsExpanded { get; set; }
bool IsSelected { get; set; }
ObservableCollection<ITreeNode> Children { get; }
ITreeNode Parent { get; set; }
string Name {get;}
}
xaml定义了一个简单的HierachicalDataTemplate:
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
然后我定义一个ItemContainerStyle来绑定IsExpanded和IsSelected属性
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="FontWeight" Value="Normal" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="FontWeight" Value="Bold" />
</Trigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
我的问题是,如果我以编程方式更改IsSelected属性,则树不会反映新选择。如果我使用鼠标进行选择,则IsSelected属性会更新。我在IsSelected属性的setter中添加了一个事件,我可以看到当我使用鼠标进行选择时,我正确地获得了2次调用IsSelected Setter,第一次为取消选择现有项目,第二次为新选定的节点。当我以编程方式执行时,我只获得单个调用,它将值设置为true。我已经尝试手动将旧节点设置为false,但这并没有太大的区别。
IsExpanded属性正常运行。事实上,如果我尝试选择一个节点向下几层,调用扩展所有父节点以便可以看到节点,一切正常,但是,实际节点没有被选中。
我已经完成了十几次代码并且它看起来很好,可能会发生什么?
由于