我有一个TreeView,它使用HierarchicalDataTemplate和视图模型作为不同节点上的数据上下文。我想从TreeView.SelectedItem访问一些TreeViewItem属性 - 但这会返回一个视图模型对象而不是TreeViewItem。
如何将TreeViewItem引用到选定的项目?
(我在SelectedItemChanged处理程序中遇到同样的问题 - 对象发送者是一个视图模型 - 如何获取TreeViewItem?)
[有一个TreeView属性SelectedContainer返回一个TreeViewItem,但它不可访问:-(]
对于世界粮食计划署来说,这种令人沮丧的事情很容易被这种“细节”所困扰,似乎必须有一个简单/明显的解决方案,但是......
答案 0 :(得分:1)
将TreeView绑定到数据上下文后,您将始终返回视图模型对象。如果要操作TreeViewItem对象以响应事件,则需要通过绑定来完成。例如,可以使用样式将IsExpanded,IsSelected属性绑定到视图模型属性。以下代码自动加粗选定的树项目,并将上述属性绑定到视图模型属性,我可以在其中操作/读取它们。
<TreeView x:Name="treeEquipment"
ItemsSource="{Binding RootEquipment}"
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<EventSetter Event="TreeViewItem.MouseRightButtonDown"
Handler="TreeViewItem_MouseRightButtonDown"/>
<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>
答案 1 :(得分:0)
我试图设置的属性是IsSelected我总是想要假,因为我管理多个选择我自己。遵循StrayPointers建议,使用视图模式的绑定:
class TreeNodeViewMode {
public bool no_selection {
get { return false; }
set { RaisePropertyChanged(); }
}
}
XAML:
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected" Value="{Binding no_selection, Mode=TwoWay}" />
</Style>
</TreeView.ItemContainerStyle>
答案 2 :(得分:0)
另一种方法是处理TreeViewItem.Selected事件,这与TreeView.SelectedItemChanged(传递视图模型)不同,这确实通过以下方式获取TreeViewItem:
TreeViewItem item = e.OriginalSource as TreeViewItem;
可以设置属性,例如
TreeViewItem item = e.OriginalSource as TreeViewItem;
if (item != null) {
item.Focus();
item.IsSelected = false;
}