C# CollectionViewSource违反MVVM

C# CollectionViewSource违反MVVM,c#,.net,wpf,mvvm,C#,.net,Wpf,Mvvm,我有一个MVVM应用程序,在我的几个VM中,我使用CollectionViewSource.GetDefaultView(datasource)初始化我的ICollectionView,它工作得非常好。 我担心的是,在虚拟机中使用CVS时是否违反了MVVM 感谢大家的投入我通常更喜欢在视图模型中公开集合,并在XAML中创建collectionviewsource: <Window.Resources> <CollectionViewSource x:Key="Colle

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


感谢大家的投入

我通常更喜欢在视图模型中公开集合,并在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
    }
}
公共类MyFilterLogic:行为
{
受保护的覆盖无效附加()
{
base.onatached();
AssociatedObject.Filter+=AssociatedObjectOnFilter;
}
私有void AssociatedObjectOnFilter(对象发送方,FilterEventTargets FilterEventTargets)
{
//过滤逻辑
}
}
其他一些专家实际上并不介意从视图模型中公开CollectionView:

可能让你感觉不好的事情:

  • 工厂方法,
    GetDefaultView
    。由于这个东西的静态特性,它也让我感觉脏兮兮的
  • 它被绑定到UI线程,您可以通过更改工作线程中的
    ObservableCollection
    了解到这一点
CollectionViewSource
是一个抽象概念,允许您指定如何组织集合,但它不显示集合,
ItemsControl
会这样做。这是好的MVVM


通常,我更喜欢将
CollectionViewSource
排除在视图模型之外,除非我需要过滤器,因为这会使视图模型更加复杂。从长远来看,
DataTemplateSelector
VisualStateGroup
通常是一种更简单的方法来更改集合的表示形式。

看看这个问题的答案:

它展示了一种MVVM方式,通过在ViewModel中包装传统项目来添加CollectionSourceView

就我所知,这样你就不会违反MVVM,并且仍然可以使用很好的分组、过滤和排序功能

不要感到难过,因为您没有像大多数示例那样在Xaml中使用CollectionViewSources;事实上,我觉得在代码中,在ViewModel中使用它们要好得多


要操作筛选、分组和排序,我向ViewModel添加命令,并在执行中更改ICollectionView

您不能使用此方法使用筛选器。在我的案例中需要筛选和搜索确保您可以-您可以将自定义行为逻辑附加到CollectionViewSource对象。我已经修改了我的答案来显示过滤。我把我的实现留在了虚拟机中。当我有时间的时候,我会回去用你的方法改变周围的事情。我想给你一分,但我的SOF声誉不够高。谢谢@eshahamt没关系,我很高兴我能帮上忙,我正在做的工作需要过滤和搜索,我在虚拟机中使用CVS的方式对我来说更容易、更高效,除非有更简单、更高效的方式。不时“违反MVVM”有什么特别的错误?代码难写吗?难读?很难测试?很难改变?模式是指导,而不是法则。如果我有机会或方法让某些东西看起来更好或工作更好,我会毫不犹豫地改变它?为什么不使用LinQ在视图模型中过滤你的集合?这就是我的虚拟机中所拥有的,那你怎么担心呢。据我所知,它并没有违反MVVM,而是CVS存在于System.Windows.Data中namespace@asdbabil视图模型是专门为应用程序编写的。您不太可能对wpf、silverlight和/或windows phone 7使用相同的视图模型。MVVM的思想是帮助您强制分离关注点。它不是帮助您设计可重用组件的模式。不要因为将视图模型程序集耦合到WPF而感到不舒服,相反,要担心视图模型类与表示它们的视图之间的解耦。CVS位于数据命名空间中的事实完全无关。MVVM位于另一个抽象层之上,我不太关心在SL或WindowsPhone7应用程序中重用我的虚拟机。这更像是我们决定四处移动文件,比方说我们决定在类库程序集中重新定位所有VM,而不是在wpf应用程序程序程序集中。在VM中使用CVS时,感觉就像在VM中实例化一个控件,如组合框或按钮。然而,在做了一些研究并得到了一些反馈之后,我感觉并没有那么糟糕:)