0

msnメッセンジャーの連絡先リストのツリービュー表示を模倣しようとしています。Contactが属する配列msngroupsを返すGroupsプロパティを持つContactオブジェクトがあります。これは、次のようなものがあることを意味します。

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

 ObservableCollection<Contact> ContactList;

したがって、連絡先は複数のグループに属することができます。CollectionViewSourceを使用して、wpf TreeViewにフィードする正しいビューを生成することは可能ですか?

4

3 に答える 3

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>

したがって、上記のグループ化を適用した後は、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>

これが役立つかどうか教えてください...

于 2012-08-02T06:41:23.180 に答える
1
////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>
于 2013-08-30T10:22:58.300 に答える
0

BeaStollnitzはこの正確な状況をカバーしました。CollectionViewSource定義をサポートしGroupDescriptions、それTreeViewもサポートします。そのリンクをチェックしてください。

于 2012-08-01T16:00:08.790 に答える