4

コレクションビューソースがあります

<CollectionViewSource x:Name="groupedItemsViewSource" 
                          ItemsPath="Items" />

それをアイテムソースとしてグリッドビューに渡します

ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"   

ソースは分離コード ファイルに設定されています。

groupedItemsViewSource.Source = AllGroups;

AllGroups は

public ObservableCollection<DataGroup> AllGroups

DataGroup には Observable アイテムのコレクションが含まれます

 public ObservableCollection<DataItem> Items

問題は、アイテムを含むグループが表示されないことです。代わりに、AllGroups の 3 つのデータグループに対応する 3 つの gridviewitem しか取得できません。

IsSourceGroupped = "true" を追加しようとしましたが、それを行うとアプリケーションがクラッシュし、「myapp.exe [3192] で未処理の win32 例外が発生しました」というウィンドウが表示されます。

4

2 に答える 2

0

CollectionViewSource の IsSourceGrouped="true" 属性だけが不足しているようです。

于 2012-09-25T09:20:28.037 に答える
0

CollectionViewSource の Source プロパティは、IGrouping インターフェイスを実装する必要があります。そうしないと、グループは GridView または ListView で機能しません。
Linq 式 GroupBy を使用して結果を指定したキーのグループにグループ化するか、次のように ObservableCollection クラスを拡張できます。

public class GroupedObservableCollection<T> : ObservableCollection<T>, IGrouping<string, T>
{
    /// <summary>
    /// Key as the Group identificator.
    /// </summary>
    public string Key { get; set; }
}

これをクラスで使用します(XAMLではなく、ViewModelにCollectionViewSourceがあります):

public GroupedObservableCollection<DataItem> Items

groupedItemsViewSource = new CollectionViewSource { Source = AllGroups, ItemsPath = new PropertyPath("Items"), IsSourceGrouped = true };

このようにして、バインディングが機能します。また、ListView と GridView で適切なバインドを使用していることを確認してください。

<!-- zoomed in view -->
<GridView ItemsSource="{Binding groupedItemsViewSource.View}" ... />

<!-- zoomed out view -->
<GridView ItemsSource="{Binding groupedItemsViewSource.View.CollectionGroups}" ... />
于 2012-09-25T08:20:01.600 に答える