我有一個MVVM應用程序,並在幾個我的虛擬機我使用CollectionViewSource.GetDefaultView(datasource)
初始化我ICollectionView,並在它完美的作品。 我的擔心是我在我的虛擬機中使用CVS時是否違反了MVVM?CollectionViewSource違反MVVM
謝謝大家對您的輸入
我有一個MVVM應用程序,並在幾個我的虛擬機我使用CollectionViewSource.GetDefaultView(datasource)
初始化我ICollectionView,並在它完美的作品。 我的擔心是我在我的虛擬機中使用CVS時是否違反了MVVM?CollectionViewSource違反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://stackoverflow.com/a/979943/3351315
事情可能會讓你感到很內疚:
GetDefaultView
。由於事物的靜態性質,它也讓我感覺很髒。ObservableCollection<T>
知道它綁定到UI線程。CollectionViewSource
是一種抽象,它允許你指定你想怎麼組織一個集合,但它並沒有顯示集合 - 一個ItemsControl
做到這一點。這是很好的MVVM!
一般情況下,我寧願保持CollectionViewSource
我的視圖模型,除非我需要的過濾器,只是因爲它使我的視圖模型更加複雜。從長遠來看,DataTemplateSelector
或VisualStateGroup
通常是更改集合展示的一種更簡單的方法。
我並不太在意在SL或Windows Phone 7應用程序中重複使用我的虛擬機。這更像是如果我們決定移動文件,讓我們說我們決定將所有虛擬機重新定位到類庫程序集中,而不是在wpf應用程序集中。在虛擬機中使用CVS時,感覺像在虛擬機中實例化一個控件,例如組合框或按鈕。然而,在做了一些研究並在這裏得到一些反饋之後,我並不覺得糟糕:) – asdbabil
看一看在這個問題的答案:Trigger Filter on CollectionViewSource
這表明通過環繞視圖模型的傳統項目添加CollectionSourceView的MVVM方式。
據我所看到的這樣,你不違反MVVM,仍然可以得到使用好的分組,過濾和排序功能。
,因爲你不使用CollectionViewSources在XAML,因爲大多數的例子千萬不要心疼;事實上,我覺得在ViewModel的代碼中使用它們會更好。
要操作的過濾,分組和排序我將命令添加到視圖模型,並在執行我改變的ICollectionView的
僅供參考,有什麼我工作的需要過濾和搜索,我有在CVS的方式我除非有更簡單和更高效的方式,虛擬機使我更容易和更高效。 – asdbabil
「違反MVVM」有什麼特別的錯誤?代碼難以寫入?難以閱讀?很難測試?難以改變?模式是指導,而不是法律。 –
如果我有機會或有辦法讓事情看起來更好或更好,我會毫不猶豫地改變它? – asdbabil