将XAML定义的CollectionViewSource绑定到ViewModel

时间:2016-09-15 18:08:20

标签: wpf mvvm binding collectionviewsource

在WPF中有很多关于CollectionViewSource的过滤,分组和排序的讨论,以及什么是isn" MVVM" -practical(特别是在代码隐藏中添加过滤器时) )。

我想让ViewModel控制这些属性(比如添加排序和过滤器描述符),但是为了将SynchronizationContext与Asynchronous ObservableCollection一起使用,我需要在View中实例化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没有&#34; Binding&#34;属性,源必须指向ObservableCollection。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

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

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