CollectionViewSource违反MVVM

时间:2014-06-10 13:22:03

标签: c# .net wpf mvvm

我有一个MVVM应用程序,在我的几个虚拟机中,我使用CollectionViewSource.GetDefaultView(datasource)初始化我的ICollectionView,它运行良好。 我担心的是,在我的虚拟机中使用CVS时,我是否违反了MVVM?

感谢大家的投入

3 个答案:

答案 0 :(得分:4)

我通常更喜欢在视图模型中公开一个集合并在XAML中创建collectionviewsource:

<Window.Resources>
    <CollectionViewSource x:Key="CollectionViewSource" Source="{Binding Items}">
        <i:Interaction.Behaviors>
            <behaviors:MyFilterLogic />
        </i:Interaction.Behaviors>
    </CollectionViewSource>
</Window.Resources>

<ItemsControl ItemsSource="{Binding Source={StaticResource CollectionViewSource}}" />

行为类:

public class MyFilterLogic: Behavior<CollectionViewSource>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.Filter += AssociatedObjectOnFilter;
    }

    private void AssociatedObjectOnFilter(object sender, FilterEventArgs filterEventArgs)
    {
        // filter logic
    }
}

其他一些专家实际上并不介意在他们的视图模型中公开CollectionView: https://stackoverflow.com/a/979943/3351315

答案 1 :(得分:1)

看看这个问题的答案:Trigger Filter on CollectionViewSource

它显示了MVVM通过将传统Items包装在ViewModel中来添加CollectionSourceView的方法。

据我所知,你没有违反MVVM,仍然可以使用漂亮的分组,过滤和排序功能。

不要因为你没有在Xaml中使用CollectionViewSources而感觉不好,就像大多数例子那样;实际上,我觉得在ViewModel代码中使用它们会更好。

要操作过滤,分组和排序,我将命令添加到ViewModel,并在执行中更改ICollectionView

答案 2 :(得分:0)

可能会让你心情不好的事情:

  • 该工厂方法,GetDefaultView。由于事物的静态特性,它让我感觉很脏。
  • 您可以通过从工作线程更改ObservableCollection<T>来了解UI线程。

CollectionViewSource是一个抽象,允许您指定组织集合的方式,但不显示集合 - ItemsControl执行此操作。这是一个很好的MVVM!

一般来说,我更喜欢将CollectionViewSource保留在我的视图模型之外,除非我需要过滤器只是因为它使我的视图模型更复杂。从长远来看,DataTemplateSelectorVisualStateGroup通常是更简单的方式来更改收藏演示文稿。