【问题标题】:How to bind an object and its properties to a treeview如何将对象及其属性绑定到树视图
【发布时间】:2020-03-06 23:27:48
【问题描述】:

我得到了一个设备列表。这些只有名称和 DeviceInfo 列表。 这些 DeviceInfos 有一个键和值。现在我想构建一个树视图,它显示每个设备并将所有值作为树视图项。而且我不知道如何在 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。 propertychanged 在别处处理。我只是为了缩短而省略了它。

这部分正在工作:


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

【问题讨论】:

    标签: c# wpf binding treeview


    【解决方案1】:

    您应该为每种类型定义一个模板:

    <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 成为树上的叶子。

    【讨论】:

      【解决方案2】:

      您应该从 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&lt;Device&gt; devices {get;set;}

      编辑:我不知道如何使用树视图,因为我从不需要它。但是您可以通过几次调整绑定来实现您的目标。

      这行代码看起来不对&lt;HierarchicalDataTemplate ItemsSource="{Binding Device}"&gt;,因为没有名为“设备”的属性

      【讨论】:

      • PropertyChanged = (sender, e) =&gt; { }这样的空事件处理程序减慢足够大的应用程序。 PropertyChanged?.Invoke() 是首选
      • 感谢您的帮助。但我在我的项目的其他地方处理了这个属性更改。
      • @DerHelm 您无法绑定到字段。你知道吗?如果您在项目中的课程与您在此处发布的完全一样。它不会工作
      猜你喜欢
      • 2012-06-21
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多