簡體   English   中英

如何將 object 及其屬性綁定到 treeview

[英]How to bind an object and its properties to a treeview

我有一個設備列表。 這些只有名稱和 DeviceInfo 列表。 這些 DeviceInfos 有一個鍵和值。 現在我想構建一個 treeView ,它顯示每個設備並作為樹視圖項顯示所有值。 而且我不知道如何在 XAML 中綁定它。

我正在使用 .NET 框架 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。 propertychanged 在別處處理。 我只是為了縮短而把它留了下來。

這部分工作:


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

您應該為每種類型定義一個模板:

<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成為樹中的葉子。

您應該從 Nuget 添加您的項目 Fody.PropertyChanged 和

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;}

編輯:我不知道如何使用 treeview 因為我從不需要它。 但是您可以通過幾次調整綁定來實現您的目標。

這行代碼看起來不對<HierarchicalDataTemplate ItemsSource="{Binding Device}">因為沒有名為 'Device' 的屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM