WPF Treeview Bindings - PullRequest
       2

WPF Treeview Bindings

2 голосов
/ 27 января 2012

Я пытаюсь привязать 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");
        }
    }

Это то, что он отображает

screenshot

То, что я хотел бы сделать, это отобразить UserName для UserViewModel и элементы Permissions List<string> в качестве дочерних элементов.Как правильно это сделать?

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Использование шаблона HierarchicalDataTemplate, например

<TreeView.Resources>
    <HierarchicalDataTemplate  DataType="{x:Type local:UserViewModel}" ItemsSource="{Binding Permission}" >
        <TextBlock Text="{Binding UserName}"/>
    </HierarchicalDataTemplate>
</TreeView.Resources>  
1 голос
/ 27 января 2012

Вы должны быть в состоянии сделать это с HierarchicalDataTemplate в дополнение к обычному DataTemplate:

<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"
0 голосов
/ 28 января 2012

С небольшой помощью обзора шаблонов данных MSDN , я думаю, что следующее будет делать то, что вы хотите. Обратите внимание, что я добавил в древовидную структуру элемент «Все пользователи» верхнего уровня:

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

Вы можете установить IsExpanded="True" на <TreeViewItem>, если хотите, чтобы древовидная структура отображалась с расширенным элементом «Все пользователи».

Обратите внимание, что я использовал обычный DataTemplate для разрешений, потому что я не думаю, что вы хотите, чтобы древовидная структура расширялась дальше разрешения. (Дерево может расширяться, потому что разрешения string с и string с реализуют IEnumerable<char>. Если вы попытаетесь раскрыть строку, вы получите список отдельных символов строка.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...