WPF TreeView разделяет размер столбца сетки на одном уровне - PullRequest
0 голосов
/ 25 января 2019

Как разделить размер столбца сетки в пределах одного уровня вместо нескольких уровней?

<TreeView ItemsSource="{Binding MyItems}" Grid.IsSharedSizeScope="True">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding Name}"/>
                <TextBlock Text="{Binding Value}" Grid.Column="1"/>
            </Grid>

        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Этот тип работает, но разделяет размер между всем деревом, а это не то, что я хотел

1 Ответ

0 голосов
/ 25 января 2019

Вот решение, которое я придумал и решил поделиться:

Во-первых, нам нужен конвертер для определения уровня дерева, в котором мы находимся (слегка измененный код из этого ответа):

 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 (parameter?.ToString() ?? "") + ((char)('A' + level)); // the group name has to be a letter, numbers didn't work
        }

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

чем мы можем использовать привязку в XAML:

<TreeView ItemsSource="{Binding MyItems}" Grid.IsSharedSizeScope="True">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Grid}}, Converter={StaticResource TreeLevelConverter}, ConverterParameter=A}"/>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Grid}}, Converter={StaticResource TreeLevelConverter}, ConverterParameter=B}"/>
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding Name}"/>
                <TextBlock Text="{Binding Value}" Grid.Column="1"/>
            </Grid>

        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Используя параметр конвертера, вы можете получить несколько групп на одном уровне.

Я надеюсь, что это поможет кому-то

...