7

ListCollectionViewViewModel にバインドされた ListView コントロールがあります。

これらのアイテムをグループ化したかったのですが、いくつか問題がありました。

最初に VM でプロパティのグループ化を設定し、GroupStyle.

C#:

ListCollectionView.GroupDescriptions.Add(new PropertyGroupDescription("Category"));

XAML:

<ListView.GroupStyle>
    <GroupStyle>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                 <TextBlock Text="{Binding Path=Name}"/>
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
    </GroupStyle>
</ListView.GroupStyle>

ただし、リストはカテゴリ名だけになり、アイテム自体を表示する方法はありません。

私はここで何が起こっているのかを完全には理解していません。のテンプレートを作成するとき、GroupStyle実際にバインドしているのは何ですか? 以外のプロパティはありNameますか?

GroupStyleたとえば、を含めた場所に、既に作成した ListView に を追加しましたItemTemplate。それは何かをいじっていGroupStyleますか?

リスト内のアイテムが別のクラスに属していて、それらが属しているクラスのインスタンスに基づいてグループ化したくない場合はどうなりますか (ID があります)。次に、この親クラスのプロパティとしてグループ名を取得します。それは可能ですか?

部分的な解決策:

ListView に適用されたスタイルに問題がありました。スタイルが何を妨害していたのか、私にはわかりません。

完全なソリューション

に設定されたパネルを使用することを選択したItemsPresenterリストボックスでを使用していませんでした。GroupStyling が正しく機能するには、ItemsPresenter を使用する必要があるようです。ControlTemplateIsItemsHosttrue

4

1 に答える 1

16

エラーはコードのどこかにあると思います。

通常、ViewModelでモデルのコレクションを公開します。

namespace Derp
{
    public sealed class ViewModel
    {
      public ObservableCollection<Model> Items {get;set;}
      // initialization code not shown
    }

    public sealed class Model
    {
      public string GroupName {get;set;}
      public string ModelName {get;set;}
    }
}

ビューで、 CollectionViewSourceをこのコレクションにバインドします。

<Window.DataContext>
    <ViewModel xmlns="clr-namespace:Derp" />
</Window.DataContext>
<Window.Resources>
    <CollectionViewSource
        Source="{Binding Items}"
        x:Key="GroupedItems">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription
                PropertyName="GroupName" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
</Window.Resources>

次に、リスト コントロールをこのCollectionViewSourceにバインドします(この例ではコンボを使用)。

<ComboBox
    ItemsSource="{Binding Source={StaticResource GroupedItems}}"
    DisplayMemberPath="ModelName">
    <ComboBox.GroupStyle>
        <GroupStyle>
            <GroupStyle.HeaderTemplate>
                <DataTemplate>
                    <TextBlock
                        Text="{Binding Name}" />
                </DataTemplate>
            </GroupStyle.HeaderTemplate>
        </GroupStyle>
    </ComboBox.GroupStyle>
</ComboBox>

混乱を招く可能性があるのは、GroupStyle内でModelに対してバインドしていないことです。 (この場合は) プロパティ " GroupName " でグループ化されたモデルのコレクションに対してバインドしています。CollectionViewSourceは、 CollectionViewGroupを拡張するコレクションにモデルをグループ化します。これらのグループには、モデルがグループ化される共通の値(プロパティの値) を含む というプロパティがあります。したがって、HeaderTemplateでは、 CollectionViewGroup.Nameにバインドしています。NameGroupName

于 2011-05-24T13:36:47.127 に答える