ObservableCollection
XAMLでバインドし、そこでグループ化を適用したかったのです。原則として、これは問題なく機能しました。
<UserControl.Resources>
<CollectionViewSource x:Key="cvs" Source="{Binding Path=TestTemplates}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Title"/>
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="TestCategory"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</UserControl.Resources>
次に、データバインディング式がItemsSource="{Binding Source={StaticResource ResourceKey=cvs}}"
の代わりになりましたItemsSource="{Binding Path=TestTemplates}"
。
最初は、ビューモデルからUIを更新するまで、すべてがクールに見えました。問題は、CollectionViewSource.GetDefaultView(TestTemplates)
グループ化が適用されたXAMLからのビューとは異なるビューを返すことです。したがって、私は選択を設定することも、それを使って何か役に立つことをすることもできませんでした。
リストをビューモデルのプロパティに直接再度バインドし、分離コードでグループ化を設定することで、これを修正できます。しかし、私はこの解決策にそれほど満足していません。
private void UserControlLoaded(object sender, RoutedEventArgs e)
{
IEnumerable source = TemplateList.ItemsSource;
var cvs = (CollectionView)CollectionViewSource.GetDefaultView(source);
if (cvs != null)
{
cvs.SortDescriptions.Add(new SortDescription("Title", ListSortDirection.Ascending));
cvs.GroupDescriptions.Add(new PropertyGroupDescription("TestCategory"));
}
}
その理由はすでにここでジョン・スキートによって与えられていると思います。
それでも、正しい見方をする方法があるはずだと思います。私が間違っている?