2010-02-27 38 views
10

我在具有各種過濾要求的對話視圖模型中使用CollectionViewSource,該模式工作正常。我還保留了屬性(SelectedProject)中所選項目的等價物,並且我想知道是否可以/應該取消它,因爲視圖將知道當前項目。我的數據綁定的樣子:CollectionViewSource CurrentItem

<ListView 
     ItemsSource="{Binding Projects.View}" 
     IsSynchronizedWithCurrentItem="True" 
     SelectedItem="{Binding SelectedProject, Mode=TwoWay}"> 

我用的引領者SelectedProject方便單元測試,以及CURRENTITEM似乎並不能夠設定據我可以看到。當我想使用它時,我還需要將它投射到正確的對象上。 OTOH,如果 SelectedProject是多餘的,那麼我會展示它與其他冗餘相同的方面並刪除它。

那麼,當您使用CollectionViewSource時,您通常如何處理當前項目?

回答

7

可以廢除了SelectedProject,但我認爲反對。如果您的代碼中包含該屬性,則清楚您正在執行的操作。如果你沒有它,你需要做類似

CollectionViewSource.GetDefaultView(Projects.View).CurrentItem as Project 

只是爲了與當前項目進行交互。我看重「內置」的清晰度。最重要的是,CurrentItem是隻讀的,所以如果你想要在ViewModel中選擇一個項目,這是不可能的。

+1

您可以使用各種移動方法設置當前項目,但我同意可讀性值得爭議的冗餘。乾杯 – Berryl 2010-02-28 16:31:09

+3

最後一點是不正確的。 CollectionView.MoveCurrentTo(對象項)將允許您更新視圖模型中的選擇。 – Gusdor 2012-03-27 15:55:52

1

您需要了解ListView中的SelectedItem獨立於ItemsSource。無論您使用CollectionViewSource還是List或Array,選定的項目都將代表該集合的項目。

所以要回答你的問題,至於爲什麼你的SelectedProject沒有設置,我建議你檢查你的setter功能的錯誤。找出綁定是否包含任何錯誤的好方法是在調試期間檢查我們的輸出是否存在任何綁定錯誤消息。注意:如果您的SelectedProject與您的Projects CollectionViewSource中的項目類型相同,那麼在使用前您不需要強制轉換它(除非您已經完成了對象類型的SelectedProject,那麼這也解釋了您的設置問題)。

編輯:對不起,簡短的回答是否定的,它不是多餘的。如果您已經進行了測試,則具有與當前項目綁定的變量不是多餘的。一個很好的例子就是當你想用舊版本測試舊版本SelectedItem時。現在,如果只參考CollectionViewSourceSelectedItem,則可能比較晚,但使用自己的變量,可以在重新設置之前測試邏輯。

+0

SelectedProject完美工作 - 問題是它是否對ColloctionViewSource CurrentItem是多餘的。 – Berryl 2010-02-28 16:25:54

1

在我的情況下,我試圖在ListBox上設置SelectedItem,而ItemsSource綁定到CollectionViewSource。這是因爲凌亂你真的需要設置的CollectionViewSource,而不是ListBox.SelectedItem當前項....所以我創建了一個擴展的方法來處理這個問題進行情景對我來說:

YourListBox.SetCurrentItemOnView<YourObjectType>(item); 

...和擴展方法定義

public static void SetCurrentItemOnView<T>(this System.Windows.Controls.ListBox listBox, T item) where T : YourObjectType 
{ 
    var view = listBox.ItemsSource as ListCollectionView; 
    if (view == null) { return; } 

    var itemToSelect = (from p in view.SourceCollection.OfType<T>() 
         where p.ID == item.ID 
         select p).FirstOrDefault(); 

    view.MoveCurrentTo(itemToSelect); 
} 

我猜這對我來說是一個問題,因爲在我的情況下項目參考我是不一樣的包含在的ItemsSource的項目參考,所以我不得不解決它是這樣的。