2010-03-27 56 views
4

CollectionViewSource.GetDefaultView()方法是在Silverlight 3在WPF不我有這樣的擴展方法:CollectionViewSource.GetDefaultView不在Silverlight 3中!什麼是解決方法?

public static void SetActiveViewModel<ViewModelType>(this ViewModelBase viewModel, 
    ViewModelType collectionItem, 
    ObservableCollection<ViewModelType> collection) where ViewModelType : ViewModelBase 
{ 
    Debug.Assert(collection.Contains(collectionItem)); 
    ICollectionView collectionView = CollectionViewSource.GetDefaultView(collection); 
    if(collectionView != null) collectionView.MoveCurrentTo(collectionItem); 
} 

怎麼可以這樣寫在Silverlight 3?

回答

2

Silverlight不包含默認視圖的概念。當你在Silverlight中要求一個控件綁定到一個集合時,它確實會綁定到集合,它不會綁定到默認視圖。

因爲我不認爲你的擴展方法可以有一個直接和完整的端口。需要重新設計您的MVVM實現。我之前沒有遇到視圖模型實例集合的概念,所以我不確定在你的情況下什麼是合適的。

我看到CollectionViewSource的幾種方法是在Xaml中定義CollectionViewSource並將它的Source綁定到ViewModel中的某些東西。或者讓ViewModel公開一個CollectionViewSource屬性,並讓View xaml綁定到它的View proeprty。

1

您可能可以做的一件事是手動創建CollectionViewSource,將其Source屬性設置爲集合,然後使用CollectionViewSource的View屬性獲取CollectionView。

像這樣的東西可能會奏效:

public static void SetActiveViewModel<ViewModelType>(this ViewModelBase viewModel, 
    ViewModelType collectionItem, 
    ObservableCollection<ViewModelType> collection) where ViewModelType : ViewModelBase 
{ 
    Debug.Assert(collection.Contains(collectionItem)); 
    CollectionViewSource collectionViewSource = new CollectionViewSource(); 
    collectionViewSource.Source = collection; 
    ICollectionView collectionView = collectionViewSource.View; 
    if(collectionView != null) collectionView.MoveCurrentTo(collectionItem); 
} 
+0

這不起作用。既然你已經創建了一個CollectionViewSource的新實例,你將得到一個沒有任何綁定的View。因此MoveCurrentTo沒有影響。在綁定到集合的WPF控件中,實際上會綁定到該集合的默認視圖,原始代碼將獲取該默認視圖並對其進行操作,從而影響綁定到該集合的任何東西。 – AnthonyWJones 2010-03-27 21:49:17

相關問題