【问题标题】:Binding XAML-defined CollectionViewSource to ViewModel将 XAML 定义的 CollectionViewSource 绑定到 ViewModel
【发布时间】:2017-01-23 20:47:13
【问题描述】:

有很多关于 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。

有没有办法做到这一点?

【问题讨论】:

    标签: wpf mvvm binding collectionviewsource


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 2017-12-14
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 2015-01-29
      相关资源
      最近更新 更多