Как настроить WPF TreeView с привязанными к данным элементами, содержащими 2 списка 2 разных типов? - PullRequest
0 голосов
/ 25 января 2012

Я пытаюсь создать древовидный элемент управления WPF (в C #, но это не так важно), который отображает иерархический список элементов. В дополнение к этому, у каждого элемента в дереве есть список «других элементов» другого типа , которые я также хотел бы отобразить (как показано ниже).

+ Item1
    - OtherItem1
    - OtherItem2
    + Item2
        - OtherItem3
        - OtherItem4
        + Item3
    + Item4

  etc...

Я бы хотел, чтобы все это было привязано к данным и поддерживало перетаскивание. У меня есть базовый список, включающий только настройку «Предмет», но у меня возникли небольшие проблемы с выяснением того, как поддерживать второй список. Если бы кто-то мог просто указать мне направление типа вещи ItemSource, которую я должен использовать, это очень помогло бы.

Мне нужен MultiBinding или что-то? Вот что я сейчас пытаюсь (но не получается).

<TreeView ItemsSource="{Binding Bones}">
    <TreeView.ItemContainerStyle>
        <!-- 
        This Style binds a TreeViewItem to a BoneTreeViewModel. 
        -->
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
            <Setter Property="FontWeight" Value="Normal" />
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="FontWeight" Value="Bold" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate DataType="{x:Type src:Skeleton.BoneTreeViewModel}">
            <HierarchicalDataTemplate.ItemsSource>
                <MultiBinding>
                    <Binding Path="Name" />
                    <Binding Path="Components" />
                </MultiBinding>
            </HierarchicalDataTemplate.ItemsSource>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Где Имя - это просто строка, представляющая имя элемента, а Компоненты - это (Плоская, не иерархическая) запись ReadOnlyCollection OtherItem.

Спасибо за чтение!

1 Ответ

1 голос
/ 25 января 2012

вот xaml, который я использую для древовидных представлений

    <TreeView ItemsSource="{Binding Items}" >
        <i:Interaction.Behaviors>
            <Behaviors:TreeViewSelectedItemBehavior SelectedItem="{Binding SelectedItem,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
        </i:Interaction.Behaviors>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                <Setter Property="FontWeight" Value="Normal" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TreeView.ItemContainerStyle>

        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Description}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

и упрощенную виртуальную машину, которую вы можете использовать в качестве базового класса для ваших двух типов виртуальных машин

public class TreeNodeViewModel
{
    public TreeNodeViewModel()
    {
        Children = new ObservableCollection<TreeNodeViewModel>();
    }

    public bool IsExpanded { get; set; }
    public bool IsSelected { get; set; }
    public string Description { get; set; }


    public ObservableCollection<TreeNodeViewModel> Children { get; set; }
}

и ссылку на перетащить ответ

...