wpf TreeViewItem绑定IsSelected属性不能以编程方式工作

时间:2014-10-17 15:09:47

标签: c# mvvm treeview

我使用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属性正常运行。事实上,如果我尝试选择一个节点向下几层,调用扩展所有父节点以便可以看到节点,一切正常,但是,实际节点没有被选中。

我已经完成了十几次代码并且它看起来很好,可能会发生什么?

由于

0 个答案:

没有答案