【问题标题】:Binding a WPF TreeView to multiple Lists将 WPF TreeView 绑定到多个列表
【发布时间】:2015-11-06 07:15:14
【问题描述】:

我想在 WPF 树视图中显示以下结构:

public class Group{
    public string Groupname;
    public IEnumerable<Group> Groups;
    public Ienumerable<User> Member;
}

我的 ViewModel 如下所示:

public class ViewModel{
    public Group RootGroup;
}

我认为 XAML 代码应该如下所示:

<TreeView>
    <TreeView.ItemTemplate>
         <HierarchicalDataTemplate ItemsSource={Binding ViewModel.RootGroup}>
             <TextBlock Text={Binding Groupname}/>
                 <HierarchicalDataTemplate ItemsSource={Binding Member}>
                     <TextBlock Text={Binding Displayname}/>
                 </HierarchicalDataTemplate>
         </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

我想要的样子:

RootGroup-Name
    -Member1
    -Member2
    -Member3
    -Member4
    -SubGroup1
        -Member1
        -Sub-SubGroup1
            -Member1
    -SubGroup2
        -Sub-SubGroup2
            -Sub-Sub-SubGroup1
                -Member1

我已经将 DataContext 绑定到自身,所以这不应该是我的 TreeView 不会显示任何内容的原因。

【问题讨论】:

    标签: c# wpf xaml binding treeview


    【解决方案1】:

    终于自己找到了解决办法:

    <TreeView Grid.Row="1" ItemsSource="{Binding MVM.RootGroup}">
      <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Groups}">
          <TextBlock Text="{Binding Name}"/>
          <HierarchicalDataTemplate.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Members}">
              <TextBlock Text="{Binding Name}"/>
              <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                  <TextBlock Text="{Binding Displayname}"/>
                </DataTemplate>
              </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
          </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
      </TreeView.ItemTemplate>
    </TreeView>
    

    但是第一层的用户迷路了。

    【讨论】:

      【解决方案2】:

      要实现该行为,您应该更改 ViewModelItemTemplate。这是我在项目中使用的一些代码。

      <HierarchicalDataTemplate DataType="local:GItemViewModel" ItemsSource="{Binding Path=Nodes}">
          <DockPanel>
              <TextBlock Margin="2" VerticalAlignment="Center" Text="{Binding Path=Name}" FontSize="12" />
          </DockPanel>
      </HierarchicalDataTemplate>
      

      ViewModel 用于此。这里Name 是组的名称,成员的名称取决于对象。成员是Nodes设置为null的节点。

      public sealed class GItemViewModel : INotifyPropertyChanged
      {
          private string _name = string.Empty;
          public string Name
          {
              get { return _name; }
              set { _name = value; NotifyPropertyChanged( "Name" ); }
          }
          public ObservableCollection<GItemViewModel> Nodes { get; set; }
      
          ...
      }
      

      我希望这会有所帮助。

      更新

      要设置根元素Name,您可以像这样添加到 ViewModel 元素中。并像这样将根集合绑定到treeView

      GItemViewModel vm = new GItemViewModel();
      GItemViewModel root = new GItemVieModel() { Name = "Root" };
      vm.Nodes.Add( root );
      treeView.ItemsSource = vm.Nodes;
      

      【讨论】:

      • 属性“节点”内的“名称”范围不是因为在您访问“名称”之前设置了 ItemsSource 吗?那么我将如何实现显示 RootGroup 的名称呢?我实际上根本没有得到你的例子,对不起。澄清一下,一个组可以同时包含成员和组。
      • NodesGItemViewModel 的集合,因此每个节点都包含Name。我认为很难将成员和组团结在一个节点中。我已经更新了根节点行为的答案。还删除了 Nodes 的私​​有集。
      • 编辑错误,绑定应该像treeView.ItemsSource = vm.Nodes;
      • 有没有办法保持我的结构并告诉程序:“嘿,显示组的名称,显示组中每个成员的名称,并为你的组列表中的每个组继续这样做" ?
      • 我已经用HierarchicalDataTemplate 和另一个TreeView 进行了测试,但它不起作用。也许您可以将ListView 添加到模板中,但我认为它无法正常工作,所以我找不到方法,对不起..
      猜你喜欢
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多