TreeView HierarchicalDataTemplate со смешанными типами - PullRequest
1 голос
/ 09 июля 2019

Я на самом деле разрабатываю свое первое приложение WPF, которое должно отображать все компоненты моего компьютера в виде дерева с иерархическими данными.

Со вчерашнего дня я столкнулся с небольшой проблемой, я прочитал множество примеров дерева.привязка, но мне не удалось связать несколько типов привязок ...

Это должно выглядеть так:

Моя машина (уровень 0)

----- Клавиатуры⬇️(уровень 1)

-------- Keyboard1⬇️ (уровень 2)

-------- Keyboard2⬇️ (уровень 2)

----- OS⬇️ (уровень 1)

----- CPU⬇️ (уровень 1)

-------- CPU1⬇️ (уровень 2)

-------- CPU2⬇️ (уровень 2)

----- VideoCard⬇️ (уровень 1)

---------VideoCard1⬇️ (уровень 2)

--------- VideoCard2⬇️ (уровень 2)

У меня есть модель просмотра со всеми моими компонентами устройства:

DeviceInfo.cs:

public class DeviceInfo
{
    public string ComputerName { get; set; }

    public Bios Bios { get; set; }
    public ComputerSystem ComputerSystem { get; set; }
    public List<Keyboard> Keyboards { get; set; }
    public OperatingSystem OperatingSystem { get; set; }
    public List<Processor> Processors { get; set; }
    public List<VideoCard> VideoCards { get; set; }
}

Каждый компонент содержит определенный атрибут, например Keyboard.cs :

public class Keyboard
{
    public string Description { get; set; }
    public string DeviceID { get; set; }
}

Я пытался сделать что-то подобное для своего дерева, я привязываю данные в Mainwindow так:

DeviceTree.ItemsSource = deviceInfos;

MainWindow.xaml :

 <TreeView Margin="10" BorderThickness="2" BorderBrush="Black" Name="DeviceTree">
                <TreeView.Resources>
                    <HierarchicalDataTemplate DataType="x:Type data:DeviceInfo" ItemsSource="{Binding Keyboards}">
                        <TextBlock Text="{Binding Description}"></TextBlock>
                    </HierarchicalDataTemplate>
                    <HierarchicalDataTemplate DataType="x:Type data:DeviceInfo" ItemsSource="{Binding OS}">
                        <TextBlock Text="{Binding Version}"></TextBlock>
                    </HierarchicalDataTemplate>
                    <HierarchicalDataTemplate DataType="x:Type data:DeviceInfo" ItemsSource="{Binding VideoCard}">
                        <TextBlock Text="{Binding SerialNumber}"></TextBlock>
                    </HierarchicalDataTemplate>
                </TreeView.Resources>
   </TreeView>

На самом деле это выглядит так в моем древовидном шаблоне:

"Model.DeviceInfo"

Каждая ссылка на подобные примеры будет полезна для меня.Заранее спасибо

Ответы [ 3 ]

1 голос
/ 09 июля 2019

A HierarchicalDataTemplate поддерживает только одно дочернее свойство.Нет смысла определять три шаблона для одного типа.Только они могут быть применены во время выполнения в любом случае.

Что вам нужно сделать, это преобразовать ваш класс DeviceInfo в класс модели дружественного представления с привязкой данных, который имеет одно дочернее свойство:

public class Item
{
    public string Header { get; set; }
    public IEnumerable<Item> Children { get; set; }
}

Затем вы должны связать ItemsSource свойство IEnumerable<Item> из четырех Item корневых объектов, то есть узлов уровня 1, клавиатуры, ОС, ЦП и видеокарты.

Также обратите внимание на синтаксис для установки свойства DataType для фактического типа вXAML:

<TreeView Margin="10" BorderThickness="2" BorderBrush="Black" Name="DeviceTree">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Item}" ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Header}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

Редактировать:

Если общее количество уровней не является динамическим, т.е. у вас всегда есть в общей сложности два уровня, вы можете установить или связатьсвойство ItemsSource для new List<DeviceInfo>(1) { deviceInfos } и добавление «статических» корневых уровней к TreeView явно в разметке XAML:

<TreeView Margin="10" BorderThickness="2" BorderBrush="Black" Name="DeviceTree">
    <TreeViewItem Header="Keyboards" ItemsSource="{Binding Keyboards}">
        <TreeViewItem.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Description}" />
            </DataTemplate>
        </TreeViewItem.ItemTemplate>
    </TreeViewItem>
    <TreeViewItem Header="Operating Systems" ItemsSource="{Binding OperatingSystem}">
        <TreeViewItem.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Version}" />
            </DataTemplate>
        </TreeViewItem.ItemTemplate>
    </TreeViewItem>
    <!-- + TreeViewItems for Processors and VideoCards -->
</TreeView>
1 голос
/ 09 июля 2019

Чтобы сделать то, что вы хотите, вам просто нужно поместить TreeViewItem в ваш основной TreeView.И если вы хотите повысить уровень, вам просто нужно добавить ItemTemplate с TreeViewItem внутри.Я приведу пример для простого объекта (Bios), а затем для списка объектов (клавиатуры).ItemSources TreeView представляет собой список DeviceInfo.

xaml:

<TreeView x:Name="MyTreeView">
    <TreeView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical">
                <TreeViewItem Header="{Binding ComputerName}">
                    <TreeViewItem.Items>
                        <TreeViewItem Header="Bios">
                            <StackPanel Orientation="Vertical">
                                <TextBlock Text="{Binding Bios.Description}"/>
                                <TextBlock Text="{Binding Bios.Name}"/>
                                <TextBlock Text="{Binding Bios.Version}"/>
                            </StackPanel>
                        </TreeViewItem>
                        <TreeViewItem Header="Keyboard" ItemsSource="{Binding Keyboards}">
                            <TreeViewItem.ItemTemplate>
                                <DataTemplate>
                                    <TreeViewItem Header="{Binding DeviceID}">
                                        <TextBlock Text="{Binding Description}"/>
                                    </TreeViewItem>
                                </DataTemplate>
                            </TreeViewItem.ItemTemplate>
                        </TreeViewItem>
                    </TreeViewItem.Items>
                </TreeViewItem>
            </StackPanel>
        </DataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
0 голосов
/ 09 июля 2019

Обычно это происходит, когда WPF не знает, как отобразить вашу модель на виде. В своем исходном коде вы определили шаблон, который показывает каждое свойство модели в TextBox. Но вы не применили их к вашему мнению.

Так что он просто показывает по умолчанию ToString () вашей модели. Вот почему вы видите только текст «Model.DeviceInfo».

Следующая ссылка будет полезна для вас.

Обзор шаблонов данных

...