2015-11-06 106 views
0

我想顯示在WPF樹視圖的結構如下:綁定WPF的TreeView多個列表

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

我的視圖模型是這樣的:

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

要實現該行爲,您應該更改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設置爲空的節點。

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您可以添加到視圖模型elemet這樣。然後像這樣將根集合綁定到treeView

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

由於在訪問「名稱」之前設置了ItemsSource,因此屬性「節點」中的「名稱」的範圍不是?那麼我如何才能顯示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

感謝您的代碼,它可以幫助我。 –