2014-06-10 19 views
3

我有一個MVVM應用程序,並在幾個我的虛擬機我使用CollectionViewSource.GetDefaultView(datasource)初始化我ICollectionView,並在它完美的作品。 我的擔心是我在我的虛擬機中使用CVS時是否違反了MVVM?CollectionViewSource違反MVVM

謝謝大家對您的輸入

+0

僅供參考,有什麼我工作的需要過濾和搜索,我有在CVS的方式我除非有更簡單和更高效的方式,虛擬機使我更容易和更高效。 – asdbabil

+0

「違反MVVM」有什麼特別的錯誤?代碼難以寫入?難以閱讀?很難測試?難以改變?模式是指導,而不是法律。 –

+0

如果我有機會或有辦法讓事情看起來更好或更好,我會毫不猶豫地改變它? – asdbabil

回答

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

+0

您不能使用此方法使用過濾器。 – Gusdor

+0

在我的情況下需要過濾和搜索 – asdbabil

+1

當然可以 - 您可以將自定義行爲邏輯附加到CollectionViewSource對象。我修改了我的回答以顯示過濾。 – eshaham

0

事情可能會讓你感到很內疚:

  • 那家工廠的方法,GetDefaultView。由於事物的靜態性質,它也讓我感覺很髒。
  • 它可以通過從工作線程中更改ObservableCollection<T>知道它綁定到UI線程。

CollectionViewSource是一種抽象,它允許你指定你想怎麼組織一個集合,但它並沒有顯示集合 - 一個ItemsControl做到這一點。這是很好的MVVM!

一般情況下,我寧願保持CollectionViewSource我的視圖模型,除非我需要的過濾器,只是因爲它使我的視圖模型更加複雜。從長遠來看,DataTemplateSelectorVisualStateGroup通常是更改集合展示的一種更簡單的方法。

+1

我並不太在意在SL或Windows Phone 7應用程序中重複使用我的虛擬機。這更像是如果我們決定移動文件,讓我們說我們決定將所有虛擬機重新定位到類庫程序集中,而不是在wpf應用程序集中。在虛擬機中使用CVS時,感覺像在虛擬機中實例化一個控件,例如組合框或按鈕。然而,在做了一些研究並在這裏得到一些反饋之後,我並不覺得糟糕:) – asdbabil

0

看一看在這個問題的答案:Trigger Filter on CollectionViewSource

這表明通過環繞視圖模型的傳統項目添加CollectionSourceView的MVVM方式。

據我所看到的這樣,你不違反MVVM,仍然可以得到使用好的分組,過濾和排序功能。

,因爲你不使用CollectionViewSources在XAML,因爲大多數的例子千萬不要心疼;事實上,我覺得在ViewModel的代碼中使用它們會更好。

要操作的過濾,分組和排序我將命令添加到視圖模型,並在執行我改變的ICollectionView的

+0

這就是我在我的虛擬機中所擁有的那些東西 – asdbabil

+0

那麼,您怎麼擔心。就我所見,它並沒有違反MVVM –

+0

這就是CVS存在於System.Windows.Data命名空間 – asdbabil