问题描述:
我点击一个节点,如何知道它在哪一层级?有没有解决方法?
以下是可能的解决方案:
如果你拥有Visual Tree中控件的引用,可能是来自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;
}
这种方法会沿着可视树向上遍历,计算在找到TreeView
控件之前发现了多少个TreeViewItem
控件。
如果您需要在XAML中使用它,例如HierarchicalDataTemplate
的DataTrigger
,那么您可以将其封装到一个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();
}
}