将 XAML 定义的 CollectionViewSource 绑定到 ViewModel

Binding XAML-defined CollectionViewSource to ViewModel

有很多关于 WPF 中 CollectionViewSource 的过滤、分组和排序的讨论,但什么是不实用的 "MVVM"(尤其是在代码隐藏中添加过滤器时)。

我想让 ViewModel 控制这些属性(比如添加排序和过滤器描述符),但是为了将 SynchronizationContext 与异步 ObservableCollection 一起使用,我需要在视图(在调度程序上)中实例化 CollectionViewSource线程),未在模型中实例化 - 但模型需要访问 CollectionViewSource 以便从代码添加过滤器、分组和排序描述符,而不是在 XAML 中定义它们。 为此,我想找到一种方法将 XAML 声明的 CollectionViewSource 对象绑定回 ViewModel。像这样:

<UserControl.Resources>
    <CollectionViewSource
        IsLiveFilteringRequested="True"
        x:Name="collectionViewSource"
        x:Key="collectionViewSource"
        Source="{Binding DataContext.myCollection, IsAsync=True}"
        Binding="{Binding DataContext.myCollectionViewSourceProperty, Mode=OneTime}" />
    </UserControl.Resources>

当然,CollectionViewSource 没有 "Binding" 属性,源必须指向 ObservableCollection。

有没有办法做到这一点?

我最初的想法是保留在 - 中定义并由 - XAML 实例化的 CollectionViewSource,然后使用某种形式的附加 属性 来绑定过滤器、组和排序属性到视图模型上的值。果然这已经完成(并且似乎有效)可以找到 here

这应该可以解决您的问题,因为 CollectionViewSource 将在 Dispatcher 线程上实例化,但可以从视图模型进行控制(确保绑定的 属性 更改也发生在 Dispatcher 线程上)。