2012-08-01 78 views
0

我想模仿MSN Messenger聯繫人列表樹視圖顯示。 我有有一個返回數組msngroups,聯絡所屬的團體性質的聯繫對象,這個意義上說,我有一些按照波紋管CollectionViewSource將一個項目分組到多個組

Class Contact 
{ 
    string Name; 
    string[] Groups {get;set;} 
} 

ObservableCollection<Contact> ContactList; 

所以聯繫人,可以在多發羣體,是可能的使用CollectionViewSource生成正確的視圖來提供一個WPF TreeView?

回答

3

當你壓扁這個層次的分組會的工作即成爲「讓每個單組重複的聯繫人」「有組聯繫」 ......

例如

如果你有4項與組像...

Dog { mammal, quadruped } 
Man { mammal, biped } 
PrayingMantis { insect, quadruped } 
Pegion { bird, biped } 

然後你新平面列表應該是這樣的......

<mammal, Dog> 
<mammal, Man> 
<bird, Pigeon> 
<insect, PrayingMantis> 
<biped, Man> 
<biped, Pigeon> 
<quadruped, Dog> 
<quadruped, PrayingMantis> 

所以applyin 分組後Keys它應該是

mammal { Dog, Man } 
bird { Pigeon } 
insect { PrayingMantis } 
biped { Man, Pigeon } 
quadruped { Dog, PrayingMantis } 

C#代碼:

//Flatten the groups into a KeyValuePair<string, Contacts> list using LINQ. 
var flatGroups 
    = listGroups.SelectMany(
     ctc => ctc.Groups.Select(
      grp => new KeyValuePair<string, Contact>(grp, ctc))).ToList();   

//Apply CollectionViewSource group on the `Key`. 
var collectionVwSrc = new CollectionViewSource(); 
collectionVwSrc.Source = flatGroups; 
collectionVwSrc.GroupDescriptions.Add(new PropertyGroupDescription("Key")); 

//Apply groups as itemssource to the TreeView. 
MyGroupsTree.ItemsSource = collectionVwSrc.View.Groups; 

XAML

<TreeView x:Name="MyGroupsTree"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Items}"> 
       <!--GroupItem.Name--> 
       <TextBlock Text="{Binding Path=Name}" 
          FontWeight="Bold"/> 
       <HierarchicalDataTemplate.ItemTemplate> 
        <DataTemplate> 
         <!--Contact.Name--> 
         <TextBlock Text="{Binding Value.Name}"/> 
        </DataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

讓我知道如果這能幫助...

+0

感謝您的答覆。它工作正常! – tesla1060 2012-08-05 11:34:09

+0

@ user1569058,如果這篇文章對你有所幫助,那麼請把它標記爲aswer。 – 2012-08-06 05:35:08

+0

乾淨的答案,不知道爲什麼沒有給出+1。無論如何,從我的+1 :) – Doug 2014-10-14 18:47:54

0
////DataItem.cs 
public class DataItem 
{ 
    public string Name { get; set; } 
    public string Path { get; set; } 
    public string[] GroupProperties { get; set; } 
} 
////MainWindow.xaml.cs 
public partial class MainWindow : Window 
{ 
    public ObservableCollection<DataItem> DataList { get; set; } 
    public MainWindow() 
    { 
     DataList = new ObservableCollection<DataItem>(new DataItem[] { 
      new DataItem(){ Name = "1111", Path = "C:\\1111", GroupProperties = new string[]{"HeNan", "JiangSu", "BeiJing"} }, 
      new DataItem(){ Name = "2222", Path = "C:\\2222", GroupProperties = new string[]{"HeNan", "TianJin", "ShenZhen"} }, 
      new DataItem(){ Name = "3333", Path = "C:\\1111", GroupProperties = new string[]{"GuangZhou", "XiAn", "BeiJing"} }, 
      new DataItem(){ Name = "4444", Path = "C:\\4444", GroupProperties = new string[]{"HeNan", "NanJing", "KunMing"} } 
     }); 

     InitializeComponent();   

    } 
} 
////MainWindow.xaml 
<Window x:Class="CultureDemo.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" 
    Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
<Window.Resources> 
    <CollectionViewSource x:Key="ListBoxSource2" Source="{Binding DataList}"> 
     <CollectionViewSource.SortDescriptions> 
      <scm:SortDescription Direction="Descending" PropertyName="Name">      
      </scm:SortDescription> 
     </CollectionViewSource.SortDescriptions> 
     <CollectionViewSource.GroupDescriptions> 
      <PropertyGroupDescription PropertyName="Path" StringComparison="OrdinalIgnoreCase"></PropertyGroupDescription> 
     </CollectionViewSource.GroupDescriptions> 
    </CollectionViewSource> 

    <CollectionViewSource x:Key="ListBoxSource3" Source="{Binding DataList}"> 
     <CollectionViewSource.SortDescriptions> 
      <scm:SortDescription Direction="Ascending" PropertyName="Name">      
      </scm:SortDescription> 
     </CollectionViewSource.SortDescriptions> 
     <CollectionViewSource.GroupDescriptions> 
      <PropertyGroupDescription PropertyName="GroupProperties" StringComparison="OrdinalIgnoreCase"></PropertyGroupDescription> 
     </CollectionViewSource.GroupDescriptions> 
    </CollectionViewSource> 

</Window.Resources> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="180*" /> 
     <ColumnDefinition Width="169*" /> 
     <ColumnDefinition Width="154*" /> 
    </Grid.ColumnDefinitions> 
    <ListBox Name="listBox1" ItemsSource="{Binding DataList}" DisplayMemberPath="Name"> 
    </ListBox> 
    <ListBox Grid.Column="1" Name="listBox2" ItemsSource="{Binding Source={StaticResource ListBoxSource2}}" > 
     <ListBox.GroupStyle> 
      <GroupStyle> 

      </GroupStyle> 
     </ListBox.GroupStyle> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}"></TextBlock> 
      </DataTemplate> 
     </ListBox.ItemTemplate>    
    </ListBox> 
    <ListBox Grid.Column="2" Name="listBox3" ItemsSource="{Binding Source={StaticResource ListBoxSource3}}"> 
     <ListBox.GroupStyle> 
      <GroupStyle> 

      </GroupStyle> 
     </ListBox.GroupStyle> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}"></TextBlock> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 
</Window> 
+0

如果您的CollectionViewSource.GroupDescriptions.GroupDescription返回從ICollection派生的對象,則WPF框架將枚舉其中的每個項目並將該項目添加到組列表 – user2732546 2013-08-30 10:28:25