8

時々、WPF は私にとって複雑すぎることがあります。「グループ」のコレクションを保持する「Window1」があります。"Group" は "Person" のコレクションを持つクラスです。最終的に、これは連絡先リストになるはずです。私が単にやりたいことは、リストグループのグループ名が私のクラス「Groups」の Name プロパティと等しい ListBox にグループとその人物を表示することです。

「コレクション」にバインドされた CollectionViewSource を試しました。グループは正しく表示されますが、リストの項目はグループ名と同じです。したがって、各グループには、グループ名という 1 つの項目しかありません。

ここにある多くの例は、1 つのコレクションのみを使用したアイテムのグループ化を示しています。私にできることは、グループ名を「人」のプロパティとして設定することです。しかし、私は数えることができません (そしてそれは本当に必要です): - 各グループに何人の人がいますか - その人の何人が「ステータス」「オンライン」を持っていますか.

「Group」クラスでlinqを使用してそれをカウントします。始めるのに役立つアドバイスをありがとう。

4

2 に答える 2

22

まあ、これがあなたが達成したいことかどうかはわかりませんが、試すことができる方法は次のとおりです。

クラスが次のようなものであると仮定します。

public class Group
{
    public string Name { get; set; }
    public List<Contact> Contacts { get; set; }
}

public class Contact
{
    public string Name { get; set; }
    public bool IsOnline { get; set; }
}

ListBox.ItemTemplate次のように、別の ListBox バインドを Contacts プロパティに設定できます。

<CollectionViewSource x:Key="groups" Source="{Binding}" >
    <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="Name" />
    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

<DataTemplate x:Key="groupTemplate" DataType="Group">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Name}" />
    </StackPanel>
</DataTemplate>

<ListBox ItemsSource="{Binding Source={StaticResource groups}}">
    <ListBox.GroupStyle>
        <GroupStyle HeaderTemplate="{StaticResource groupTemplate}" />
    </ListBox.GroupStyle>
    <ListBox.ItemTemplate>
        <DataTemplate DataType="Contact">
            <ListBox ItemsSource="{Binding Contacts}">
                <ListBox.ItemTemplate>
                    <DataTemplate DataType="Contact">
                        <TextBlock Text="{Binding Name}" />
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

内側のリストボックスのスタイルを少し変更する必要があります。

編集:使用による別のソリューションTreeView

<DataTemplate DataType="Contact">
   <TextBlock Text="{Binding Name}" />
</DataTemplate>

<TreeView ItemsSource="{Binding Source={StaticResource groups}}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate DataType="Group" ItemsSource="{Binding Contacts}">
            <TextBlock Text="{Binding Name}" />
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
于 2009-05-22T07:25:41.087 に答える
8

Programming WPFのコピーがある場合は、ページ 221 にジャンプします。ない場合は、要約します (私の不適切な方法で)。

まず、Person オブジェクトを手動でグループ化する必要はありません。

各 Person オブジェクトに Group プロパティがある場合、

People people = // retrieve the List<Person> somehow
ICollectionView view = CollectionViewSource.GetDefaultView(people);
view.GroupDescriptions.Add( new PropertyGroupDescription("Group") );

ItemsControl から派生したすべてのコントロールは、グループ化された項目を表示できるため、

// the XAML
<ListBox ... ItemsSource={Binding}>
  <ListBox.GroupStyle>
    <x:Static Member="GroupStyle.Default" />
  </ListBox.GroupStyle>
</ListBox>

また、カスタム GroupStyle を定義し、GroupStyle.HeaderTemplate を指定して、'some PropertyValue (Count)' などのカスタム属性を示す新しい DataTemplate を定義することもできます - 1 つの TextBlock をバインドし、もう 1 つ{Binding SomeProperty}{Binding ItemCount}

HTH

于 2009-05-22T06:52:23.480 に答える