2010-03-27 72 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

相关问题