【问题标题】:WPF Treeview BindingsWPF 树视图绑定
【发布时间】:2012-02-20 17:10:00
【问题描述】:

我正在尝试将 ObservableCollection 绑定到 WPF 中的树视图。它确实起到了一定的作用,但并不完全像我想象的那样。

这是我设置的绑定

    <TreeView Height="250" ItemsSource="{Binding Path=TheUsers}" VerticalAlignment="Bottom" Width="500" Margin="0,39,0,0">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Path=Permission}">
                <TextBlock Text="{Binding}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView> 

这是它绑定到的集合:

    ObservableCollection<UserViewModel> theUsers;
    public ObservableCollection<UserViewModel> TheUsers
    {
        get
        {
            return theUsers;
        }
        set
        {
            theUsers = value;
            OnPropertyChanged("TheUsers");
        }
    }

这是集合中的对象:

public class UserViewModel
{     
    string userName = null;
    public string UserName
    {
        get
        {
            return userName;
        }
        set
        {
            userName = value;
            OnPropertyChanged("UserName");
        }
    }

    int permCount = 0;
    public int PermCount
    {
        get
        {
            return permCount;
        }
        set
        {
            permCount = value;
            OnPropertyChanged("PermCount");
        }
    }

    List<string> permission = null;
    public List<string> Permission
    {
        get
        {
            return permission;
        }
        set
        {
            permission = value;
            OnPropertyChanged("Permission");
        }
    }

这是它显示的内容

我希望它显示 UserViewModel 的 UserName 和 Permissions List&lt;string&gt; 项作为子项。这样做的正确方法是什么?

提前致谢!

【问题讨论】:

    标签: c# wpf treeview


    【解决方案1】:

    使用 HierarchicalDataTemplate 之类的

    <TreeView.Resources>
        <HierarchicalDataTemplate  DataType="{x:Type local:UserViewModel}" ItemsSource="{Binding Permission}" >
            <TextBlock Text="{Binding UserName}"/>
        </HierarchicalDataTemplate>
    </TreeView.Resources>  
    

    【讨论】:

      【解决方案2】:

      除了普通的DataTemplate 之外,您应该可以使用HierarchicalDataTemplate 来执行此操作:

      <TreeView Height="250" ItemsSource="{Binding Path=TheUsers}" VerticalAlignment="Bottom" Width="500" Margin="0,39,0,0">
          <TreeView.Resources>
              <HierarchicalDataTemplate DataType="{x:Type local:UserViewModel}" ItemsSource="{Binding Permission}">
                  <TextBlock Text="{Binding Path=UserName}" />
              </HierarchicalDataTemplate>
              <DataTemplate DataType="{x:Type sys:String}" >
                  <TextBlock Text="{Binding}" />
              </DataTemplate>
          </TreeView.Resources>
      </TreeView> 
      

      将以下命名空间添加到您的控件/窗口:

      xmlns:local="clr-namespace:WhateverYourAssemblyNamespaceIs"
      xmlns:sys="clr-namespace:System;assembly=mscorlib"
      

      【讨论】:

        【解决方案3】:

        the MSDN DataTemplating overview 的帮助下,我认为以下内容将满足您的需求。请注意,我已将顶级“所有用户”项添加到树视图:

        <Window.Resources>
            <HierarchicalDataTemplate DataType="{x:Type local:UserViewModel}" ItemsSource="{Binding Path=Permission}">
                <TextBlock Text="{Binding Path=UserName}"/>
            </HierarchicalDataTemplate>
            <DataTemplate DataType="{x:Type sys:String}">
                <TextBlock Text="{Binding}"/>
            </DataTemplate>
        </Window.Resources>
        
        ...
        
        <TreeView Height="250" VerticalAlignment="Bottom" Width="500" Margin="0,39,0,0">
            <TreeViewItem ItemsSource="{Binding Path=TheUsers}" Header="All Users" />
        </TreeView>
        

        将前缀 local 替换为与您的 UserViewModel 类所在的命名空间绑定的命名空间前缀。

        如果您希望在展开所有用户项的情况下显示树视图,则可以在 &lt;TreeViewItem&gt; 上设置 IsExpanded="True"

        请注意,我使用普通的DataTemplate 来获取权限,因为我认为您不希望树视图在权限之外进一步扩展。 (树可以扩展,因为权限是strings,而strings 实现IEnumerable&lt;char&gt;。如果您尝试扩展字符串,您将获得字符串中各个字符的列表。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-10
          • 2011-07-14
          • 2011-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多