задан вопрос: -
поэтому, когда я щелкаю узел, как узнать, какой это уровень? есть ли обходной путь?
Вот возможный обходной путь: -
Если у вас есть ссылка на элемент управления в Визуальном дереве , возможно, из события 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();
}
}