2012-08-01 2 views
0

msn 메신저 대화 상대 트리보기를 모방하려고합니다. 내가 배열은 연락이 속한 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에있는

이어야합니다.

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

+0

@ user1569058이 게시물이 도움이 되었다면 그것을 aswer로 표시하십시오. –

+0

깨끗한 답변, +1 한 이유가 확실하지 않습니다. 어쨌든, 나에게서 +1 : – Doug

0

베아 Stollnitz는 covered this exact situation.CollectionViewSource 지지체 GroupDescriptions 정의, TreeView 또한 지원한다. 그 링크를 확인하십시오. 이 계층 구조를 평평 때

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