C# wpf TreeViewItem绑定的IsSelected属性无法以编程方式工作
我正在使用MVVM绑定到树。我是以一种相当标准的方式进行此操作的,即树中的每个节点对象都支持ITreeNode接口:C# wpf TreeViewItem绑定的IsSelected属性无法以编程方式工作,c#,mvvm,treeview,C#,Mvvm,Treeview,我正在使用MVVM绑定到树。我是以一种相当标准的方式进行此操作的,即树中的每个节点对象都支持ITreeNode接口: public interface ITreeNode { bool IsExpanded { get; set; } bool IsSelected { get; set; } ObservableCollection<ITreeNode> Children { get; } ITreeNode Parent { get; set;
public interface ITreeNode
{
bool IsExpanded { get; set; }
bool IsSelected { get; set; }
ObservableCollection<ITreeNode> Children { get; }
ITreeNode Parent { get; set; }
string Name {get;}
}
xaml定义了一个简单的层次结构数据模板:
<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中添加了一个事件,我可以看到,当我使用鼠标进行选择时,我正确地得到了对IsSelected setter的两个调用,第一个为false以取消选择现有项,第二个为True以取消选择新选择的节点。当我以编程方式执行时,我只得到一个调用,它将值设置为true。我已经尝试手动将旧节点设置为false,但这没有任何区别
IsExpanded属性工作正常。事实上,如果我尝试选择一个向下几层的节点,则展开所有父节点以便可以看到该节点的调用都可以正常工作,但是,实际节点没有被选中
我已经读了十几遍代码,看起来很好,这里会发生什么
谢谢向我们展示您的ITreeNode的具体实现。这个问题已经解决了,代码没有改变!经过数小时的查找,我开始在VisualStudio中遇到问题,所以我清理了项目,删除了缓存的obj文件并重新启动了VS,然后它工作得很好!