我有一个MVVM应用程序,在我的几个虚拟机中,我使用CollectionViewSource.GetDefaultView(datasource)
初始化我的ICollectionView,它运行良好。
我担心的是,在我的虚拟机中使用CVS时,我是否违反了MVVM?
感谢大家的投入
答案 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
保留在我的视图模型之外,除非我需要过滤器只是因为它使我的视图模型更复杂。从长远来看,DataTemplateSelector
或VisualStateGroup
通常是更简单的方式来更改收藏演示文稿。