WPF中树视图的级别?

时间:2009-01-13 03:09:05

标签: c# wpf winforms treeview

WinForms 应用程序中,treeview的级别由node.level给出。 WPF 中的相应命令是什么?

2 个答案:

答案 0 :(得分:8)

您问题的直接答案是WPF中没有级别属性。

winforms控件和wpf控件之间没有一对一的关系。因为两者的底层架构和用法完全不同。在WPF中,您将一个层次结构数据(LinkedList类型的Datastructure)绑定到TreeView,并将HeirarchicalDataTemplate定义为Treeview.ItemTemplate属性

答案 1 :(得分:7)

鉴于问题: -

  

所以当我点击一个节点时,我怎么知道它是哪个级别?有解决方法吗?

这是一种可能的解决方法: -

如果您在 Visual Tree 中引用了一个Control,可能来自Click事件,那么您可以使用该控件来确定它在树视图中的级别调用这样的函数,我过去曾经使用过。

private int FindTreeLevel(DependencyObject control)
{
  var level = -1;
  if (control != null)
  {
    var parent = VisualTreeHelper.GetParent(control);
    while (!(parent is TreeView) && (parent != null))
    {
      if (parent is TreeViewItem)
        level++;
      parent = VisualTreeHelper.GetParent(parent);
    }
  }
  return level;
}

此方法将向上移动VisualTree并计算在找到TreeViewItem控件时停止之前找到的TreeView个控件的数量。

如果您需要在XAML中使用此功能,例如DataTrigger HierarchicalDataTemplate,那么您可以将其打包到IValueConverter

<Window.Resources>
  <local:TreeLevelConverter x:Key="treeLevelConverter"/>

  <HierarchicalDataTemplate DataType="{x:Type local:MyType}" >
  ...
     <Grid ... >
         <TextBlock x:Name="MyControl" ... />
     ...
     </Grid>
     <HierarchicalDataTemplate.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource treeLevelConverter}}" Value="0" >
              <Setter TargetName="MyControl" Property="Background" Value="Red"/>
        </DataTrigger>
    </HierarchicalDataTemplate.Triggers>
  </HierarchicalDataTemplate>
</Window.Resources>

然后使用以下转换器

  public class TreeLevelConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
      var level = -1;
      if (value is DependencyObject )
      {
        var parent = VisualTreeHelper.GetParent(value as DependencyObject );
        while (!(parent is TreeView) && (parent != null))
        {
          if (parent is TreeViewItem) 
            level++;
          parent = VisualTreeHelper.GetParent(parent);
        }
      }
      return level;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
      throw new System.NotImplementedException();
    }
  }