将 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 线程上)。
有很多关于 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 线程上)。