[英]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.