将WPF TreeView绑定到多个列表

时间:2015-11-06 07:15:14

标签: c# wpf xaml binding treeview

我想在WPF Treeview中显示以下结构:

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不会显示任何内容的原因。

2 个答案:

答案 0 :(得分:2)

最后我自己找到了解决方案:

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

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

答案 1 :(得分:1)

要实现这种行为,您应该更改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 elemet中。并将根集合绑定到treeView,就像这样。

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