我有一个MVVM应用程序,我的几个VM中使用CollectionViewSource.GetDefaultView(datasource)
初始化我的ICollectionView,并且它运行得非常完美。
我的担忧是,在我的VM中使用CVS时是否违反了MVVM?
谢谢大家的意见。
我有一个MVVM应用程序,我的几个VM中使用CollectionViewSource.GetDefaultView(datasource)
初始化我的ICollectionView,并且它运行得非常完美。
我的担忧是,在我的VM中使用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
}
}
实际上,有些专家并不介意从视图模型中公开CollectionView: https://dev59.com/VHNA5IYBdhLWcg3wZ85R#979943
请看这个问题的答案:Trigger Filter on CollectionViewSource。
它展示了一种使用MVVM方式通过在ViewModel中包装传统项来添加CollectionSourceView的方法。
据我所知,这种方式不违反MVVM,并且仍然可以使用漂亮的分组、过滤和排序功能。
不要因为你没有像大多数示例那样在Xaml中使用CollectionViewSources而感到难过;事实上,我觉得在ViewModel中使用它们比在代码中使用更好。
为了操作过滤、分组和排序,我向ViewModel添加命令,并在执行时更改ICollectionView。
可能会让你感到不舒服的事情:
GetDefaultView
。由于其静态性质,它也让我感到很不舒服。ObservableCollection<T>
所知道的那样,它绑定到 UI 线程。CollectionViewSource
是一个抽象类,允许您指定如何组织集合,但它不显示集合 - ItemsControl
显示集合。这是良好的 MVVM!
通常,除非需要过滤器,否则我喜欢将 CollectionViewSource
保留在我的视图模型之外,因为它会使我的视图模型更加复杂。在长期运行中,DataTemplateSelector
或 VisualStateGroup
通常是更简单的更改集合呈现方式的方法。