Как привязать объект и его свойства к древовидной структуре - PullRequest
0 голосов
/ 11 ноября 2019

Я получил список устройств. Они имеют только имена и список DeviceInfos. Эти DeviceInfos имеют ключ и значения. Теперь я хочу построить TreeView, который показывает каждое устройство и в виде TreeView элементы все значения. Абд я не знаю, как связать это в XAML.

Я использую .NET Framework 4.8


    public class Device
    {
        public string Name {get; set;}
        public List<DeviceInfo> deviceInfos {get; set;}
    }

    public class DeviceInfo
    {
        public int key {get; set;}
        public value values {get; set;}
    }

    public class values
    {
         public string Type {get; set;}
         public string TypeName {get; set;}
    }

    public List<Device> devices {get; set;}


    <TreeView ItemsSource="{Binding devices}" Margin="2">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Device}">
                <TreeViewItem Header="{Binding name}">
                    <TreeViewItem ItemsSource="{Binding deviceInfos}" Header="{Binding TypeName}">
                    </TreeViewItem>
                </TreeViewItem>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

Плановый результат должен выглядеть примерно так:

+ Device  
    + DeviceInfo.Value.Type  
        DeviceInfo.ValueTypeName  
+ Device3  
    + DeviceInfo.Value.Type  
        DeviceInfo.ValueTypeName  
    + DeviceInfo.Value.Type  
        DeviceInfo.ValueTypeName  
    + DeviceInfo.Value.Type  
        DeviceInfo.ValueTypeName  
+ Device3  
    + DeviceInfo.Value.Type  
        DeviceInfo.ValueTypeName

Редактировать
Извините за неясный вопрос. Я получил это работает для рута. Итак, я вижу deviceName и могу его развернуть. но я не могу показать DeviceInfos. Измененная собственность обрабатывается в другом месте. я просто оставил это для сокращения.

Эта часть работает:


<TreeView ItemsSource="{Binding devices}" Margin="2">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Device}">
            <TreeViewItem Header="{Binding name}">
            </TreeViewItem>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Вы должны определить шаблон для каждого типа:

<TreeView ItemsSource="{Binding devices}" Margin="2">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Device}" ItemsSource="{Binding deviceInfos}">
            <TextBlock Text="{Binding Name}" />
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type local:DeviceInfo}">
            <TextBlock Text="{Binding values.Type}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

Если вы хотите иметь возможность развернуть DeviceInfo, у него должно быть свойство IEnumerable. Ваши values типы не кажутся IEnumerable, что фактически делает DeviceInfo листом дерева.

0 голосов
/ 11 ноября 2019

Вы должны добавить свой проект Fody.PropertyChanged из Nuget и

public class Device : INotifyPropertyChanged
{
    public string name {get;set;}
    public ObservableCollection<DeviceInfo> deviceInfos {get;set;}
    public event PropertyChangedEventHandler PropertyChanged = (sender, e) 
}

public class DeviceInfo : INotifyPropertyChanged
{
    public int key {get;set;}
    public values value {get;set;}
    public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };
}

public class values : INotifyPropertyChanged
{
     public string Type {get;set;}
     public string TypeName {get;set;}
     public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };
}

Затем вы можете сделать привязки к ObservableCollection<Device> devices {get;set;}

Редактировать: я не знаю, как использовать дерево, потому чтомне это никогда не нужноНо вы можете достичь своей цели, подправив привязки несколько раз.

Эта строка кода выглядит неправильно <HierarchicalDataTemplate ItemsSource="{Binding Device}">, поскольку нет свойства с именем 'Device'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...