【问题标题】:Treeview with multiple (two) hierarchical child nodes具有多个(两个)分层子节点的树视图
【发布时间】:2021-09-15 14:27:18
【问题描述】:

我正在尝试构建一个包含一个根元素并包含 2 个子元素的树结构。子元素又包含其他子元素。

根以下的元素是独立的类,彼此无关。

现在我在 WPF 中的显示出现问题,我无法正确显示根目录下的两个元素

整个事情应该是这样的:

Configuration 1
 - Zones
    - Zone 1
    - Zone 2
 - Probes
    - Probe 1
    - Probe 2

Configuration 2
 - Zones
    - Zone 1
    - Zone 2
 - Probes
    - Probe 1
    - Probe 2

这是我的标记:

     <TreeView ItemsSource="{Binding Configurations}">

        <TreeView.Resources>
           <HierarchicalDataTemplate x:Key ="ZoneTemplate" DataType="{x:Type common:VMZonesPlan}" ItemsSource="{Binding ZonePlans}">
              <TextBlock Text="Zone XY"/>
              <HierarchicalDataTemplate.ItemTemplate>
                 <DataTemplate DataType="{x:Type common:VMZone}">
                    <ui:EditableTextBlock  Text="{Binding ZoneName}"/>
                 </DataTemplate>
              </HierarchicalDataTemplate.ItemTemplate>
           </HierarchicalDataTemplate>

           <HierarchicalDataTemplate x:Key="ZoneHeader" DataType="{x:Type vm:VMZones}" 
                               ItemsSource="{Binding Zones}" 
                               ItemTemplate="{StaticResource ZoneTemplate}">

              <TextBlock x:Uid="TitleText"  Text="ZoneTitle"/>
           </HierarchicalDataTemplate>


           <HierarchicalDataTemplate x:Key ="ProbeTemplate" DataType="{x:Type vm:VMProbeEndeffectors}" ItemsSource="{Binding ProbeEndeffectors}">
              <TextBlock Text="Zone XY"/>
              <HierarchicalDataTemplate.ItemTemplate>
                 <DataTemplate>
                    <TextBlock Text="Probe Child"/>
                 </DataTemplate>
              </HierarchicalDataTemplate.ItemTemplate>
           </HierarchicalDataTemplate>

           <HierarchicalDataTemplate x:Key="ProbeHeader" DataType="{x:Type vm:VMProbe}" 
                                     ItemsSource="{Binding Probes}" 
                                     ItemTemplate="{StaticResource ProbeTemplate}">

              <TextBlock x:Uid="TitleText"  Text="ZoneTitle"/>
           </HierarchicalDataTemplate>

        </TreeView.Resources>
     </TreeView>

这是我的代码:

public class VMTreeView: ViewModelBase 
{
     public ObservableCollection <ViewModelConfiguration> Configurations { get; set; }

     public VMTreeView() 
     {
         Configurations = new ObservableCollection<ViewModelConfiguration>();
         var firstNode = new Configuration(param);
         Configurations.Add(firstNode);
     }
}

public class ViewModelConfiguration 
{
     public ObservableCollection<Probe> Probes { get; set; }
     public ObservableCollection<Zones> Zones { get; set; }

     public ViewModelConfiguration() 
     {
         Probes = new ObservableCollection <Probe> {...};
         Zones = new ObservableCollection <Zones> {...};
     }
}

我已经看到有可能以某种方式我必须改变什么?还是 WPF 不能这样?

【问题讨论】:

  • 您的示例代码一团糟。 DMEConfigurations 和 Configuration 是什么?
  • 感谢您的提示,复制粘贴错误这是一个非常复杂的示例,我在这里简化了

标签: c# wpf xaml


【解决方案1】:

您应该定义一个包含自身子级的分层类型:

public class ViewModelConfiguration
{
    public ObservableCollection<ViewModelConfiguration> Children { get; }
        = new ObservableCollection<ViewModelConfiguration>();

    public ViewModelConfiguration(string name) =>
        Name = name;

    public string Name { get; }
}

XAML:

<TreeView ItemsSource="{Binding Configurations}">

    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:ViewModelConfiguration}" ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Name}"/>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

然后在视图模型中构建探针和区域树:

public class VMTreeView
{
    public ObservableCollection<ViewModelConfiguration> Configurations { get; }
        = new ObservableCollection<ViewModelConfiguration>();

    public VMTreeView()
    {
        var conf1 = new ViewModelConfiguration("Conf. 1");
        var zones = new ViewModelConfiguration("Zones");
        var zone1 = new ViewModelConfiguration("Zone 1");
        var zone2 = new ViewModelConfiguration("Zone 2");
        zones.Children.Add(zone1);
        zones.Children.Add(zone2);
        conf1.Children.Add(zones);

        Configurations.Add(conf1);
        ...
    }
}

【讨论】:

  • 探针在哪里?您的示例中缺少它们吗?这正是我的问题。区域和子级处于同一级别,并且已作为子级存在于配置中。只有区域或子项绑定的分层模板没有问题。只有当我想绑定它们时才会出现问题
  • 问题只是另一个ViewModelConfiguration被添加到conf1。我认为这很明显,对不起。你不绑定到他们两个。您绑定到单个属性,然后按照我在答案中所写的那样在视图模型中自己构建树。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
相关资源
最近更新 更多