在WPF中,关于CollectionViewSource的筛选,分组和排序有很多讨论,什么是不“MVVM”实用的(尤其是在后面的代码中添加Filters时)。

我想让ViewModel控制这些属性(例如添加排序和过滤器描述符),但是为了将SynchronizationContext与Asynchronous ObservableCollection一起使用,我需要在View中(在分派(dispatch)器线程上)实例化CollectionViewSource,而不是在模型中实例化-但是模型需要访问CollectionViewSource,以便从代码中添加过滤器,分组和排序描述符,而不是在XAML中定义它们。
为此,我想找到一种将XAML声明的CollectionViewSource对象BACK绑定(bind)到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中定义并由XAML实例化的CollectionViewSource,然后使用某种形式的附加属性将筛选器,组和排序属性绑定(bind)到 View 模型上的值。可以肯定地说,这已经完成了(并且似乎起作用了),就像here一样。

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

关于wpf - 将XAML定义的CollectionViewSource绑定(bind)到ViewModel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39517652/

10-12 03:56