2015-11-06 4 views
0

Я хотел бы, чтобы отобразить следующую структуру в WPF 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 ничего не покажет.

ответ

1

Для этого вы должны изменить ViewModel и ItemTemplate. Вот код, который я использовал в своем проекте.

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

    ... 
} 

Надеюсь, это поможет.

Update

Чтобы установить корневой элемент Name вы можете добавить в модели представления elemet как это. И привяжите корневую коллекцию к treeView следующим образом.

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

Не является ли область «Имя» внутри «Узлов» свойств, потому что ItemSource был установлен до того, как вы получили доступ к «Имя»? Итак, как бы я смог отобразить имя RootGroup? Прошу прощения. Чтобы уточнить, группа может содержать группы и группы одновременно. – C4p741nZ

+0

'Nodes' - это коллекция' GItemViewModel', поэтому каждый узел содержит 'Name'. Я думаю, что сложно объединить участников и группы в одном узле. Я обновил ответ для поведения корневого узла. Также удален закрытый набор для 'Nodes'. – bars222

+0

Отредактированная ошибка, привязка должна выглядеть так: treeView.ItemsSource = vm.Nodes; ' – bars222

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> 

Но Пользователи из первого уровня заблудиться.

+0

Спасибо за код, это мне помогает. –

Смежные вопросы