8

ObservableCollectionXAMLでバインドし、そこでグループ化を適用したかったのです。原則として、これは問題なく機能しました。

<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"));
    }
}

その理由はすでにここでジョン・スキートによって与えられていると思います。

それでも、正しい見方をする方法があるはずだと思います。私が間違っている?

4

3 に答える 3

6

あなたはそれをすることができませんでしたか?

var _viewSource = this.FindResource("cvs") as CollectionViewSource;

データが接続されている場合は、ビューが更新されると思います。

于 2012-06-26T15:15:50.247 に答える
5

ビューでコレクション ビューを定義するのではなく、VM からコレクション ビューを公開する傾向があります。

public ICollection<Employee> Employees
{
    get { ... }
}

public ICollectionView EmployeesView
{
    get { ... }
}

そうすれば、VM はビューに公開されるものを完全に制御できます。たとえば、ユーザーの操作に応じて並べ替え順序を変更できます。

于 2012-06-15T08:01:46.687 に答える
1

J. Lennonの回答に基づいて方法を見つけました。コマンドでリソースにアクセスできるものを渡すと、CollectionViewSourceそこを検索できます。

XAML の場合 (CollectionViewResource上記のように):

<Button Command="{Binding Command}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}">Do it!</Button>

そして VM コードでは:

private void Execute(object parm)
{
    var fe = (FrameworkElement)parm;
    var cvs = (CollectionViewSource)fe.FindResource("cvs");
    cvs.View.Refresh();
}

RelayCommandExecuteに与えられるものです

これは質問に答えますが、私はあまり好きではありません。意見?

于 2012-06-27T06:07:33.867 に答える