我在WPF TreeView中显示了一个两级层次结构,但我只希望子节点可以选择 - 基本上顶层节点用于分类但不应该自己选择。
我可以实现吗?
...谢谢
答案 0 :(得分:5)
为每种类型的物品定义样式,比如Bijington写道。对于不可选节点,将容器的Focusable-Property(TreeViews的TreeViewItem)设置为false。
答案 1 :(得分:2)
为此,您需要覆盖树视图的样式。理想情况下,您将有两种类型的树视图项,一种用于顶级节点(即假设文件夹),另一种仅用于子项,那么您应该能够定义树中每种项类型的行为方式。 因此,为每个项目类型创建一个样式,然后对于文件夹节点,只需更改触发器就可以选择不执行任何操作。
答案 2 :(得分:0)
我写了附属物,它会在选择后立即取消选择树形图:
public class TreeViewItemHelper
{
public static bool GetIsSelectable(TreeViewItem obj)
{
return (bool)obj.GetValue(IsSelectableProperty);
}
public static void SetIsSelectable(TreeViewItem obj, bool value)
{
obj.SetValue(IsSelectableProperty, value);
}
public static readonly DependencyProperty IsSelectableProperty =
DependencyProperty.RegisterAttached("IsSelectable", typeof(bool), typeof(TreeViewItemHelper), new UIPropertyMetadata(true, IsSelectablePropertyChangedCallback));
private static void IsSelectablePropertyChangedCallback(DependencyObject o, DependencyPropertyChangedEventArgs args)
{
TreeViewItem i = (TreeViewItem) o;
i.Selected -= OnSelected;
if(!GetIsSelectable(i))
{
i.Selected += OnSelected;
}
}
private static void OnSelected(object sender, RoutedEventArgs args)
{
if(sender==args.Source)
{
TreeViewItem i = (TreeViewItem)sender;
i.IsSelected = false;
}
}
}
不幸的是,当您点击一个不可选的项目时,您仍会丢失旧的选择:(
答案 3 :(得分:0)
假设所有子节点都没有子节点,则可以通过样式中的触发器使子节点只能选择,如下所示:
<TreeView Name="MyTreeView>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Style.Triggers>
<Trigger Property="HasItems" Value="true">
<Setter Property="Focusable" Value="False" />
</Trigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
在父级TreeViewItems上将Focusable设置为false还会阻止选择它们。