我正在使用表示模型通过TreeView控件在我的应用程序中实现导航。我通过双向绑定将TreeViewItem的IsSelected属性绑定到我的视图模型。当选择一个有子节点的节点时,我希望选择该节点的第一个子节点,而不是被单击的那个节点。在我的表示模型上设置IsSelected属性时,TreeViewItem似乎没有侦听属性更改事件。第一个子节点被选中,但父节点没有取消选择。下面是我的表示模型中的代码。
public bool IsSelected {
get {
return this._isSelected;
}
set {
if(this._isSelected != value) {
this._isSelected = value;
if(this.Nodes.Count > 0) {
this._isSelected = false;
this.Nodes[0].IsSelected = true;
}
this.NotifyPropertyChanged("IsSelected");
}
}
}这是我的TreeViewItem的风格
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>发布于 2009-11-19 00:10:36
我遇到了一个非常类似的问题,我发现当我通过代码选择子节点时,我还需要将焦点放在TreeViewItem包装器上,这样父节点就会出现您所说的"UnSelect“。因此,我在xaml中添加了一个事件处理程序:
<EventSetter Event="TreeViewItem.Selected"
Handler="TreeViewItem_Selected"
/>在分部类中:
Private Sub TreeViewItem_Selected(ByVal sender As System.Object, ByVal e As RoutedEventArgs)
If CType(sender, TreeViewItem) IsNot Nothing Then
CType(sender, TreeViewItem).Focus()
e.Handled = True
End If
End Sub发布于 2009-11-19 14:00:56
另一种需要考虑的可能性是:
TreeView试图确保树中的两个TreeViewItems不可能同时被选中,因此它应该防止这种情况发生。这可能是TreeView中的一个bug,但也可能是您使用TreeView的方式的问题。
为了提高效率,TreeView在如何找到它下面的TreeViewItems时非常挑剔。算法实际上就是这样(以增量的方式完成):
因此,如果每个级别的TreeViewItems都直接位于前一个级别下,则TreeView只能找到它的后代。
例如,这是可行的:
<TreeView>
<TreeViewItem>
<TreeViewItem />
</TreeViewItem>
...
</TreeView>这个也是一样的:
<HierarchicalDataTemplate TargetType="{x:Type MyItemType"} ItemsSource="{Binding subItems}">
...
</HierarchicalDataTemplate>
<TreeView ItemsSource="{Binding items}" />但如果插入非TreeViewItems,它将不起作用,如下所示:
<TreeView>
<TreeViewItem>
<Border>
<TreeViewItem/>
</Border>
</TreeViewItem>
</TreeView>或者这样:
<TreeView>
<DockPanel>
<TreeViewItem>
<TreeViewItem/>
</TreeViewItem>
</DockPanel>
</TreeView>最后两个案例可以很好地显示,但是TreeView看不到TreeViewItems,因此它的选择代码将被禁用。这将导致您所描述的症状。
我不知道你的情况是不是这样,但我想我应该提一下,以防万一。
发布于 2018-05-30 21:33:00
这是阿米尔答案的C#版本:
private void TreeViewItem_Selected(object sender, RoutedEventArgs e)
{
var treeViewItem = sender as TreeViewItem;
if (treeViewItem != null)
{
treeViewItem.Focus();
e.Handled = true;
}
}https://stackoverflow.com/questions/834267
复制相似问题