Wpf CollectionViewSource.GetDefaultView不在Silverlight 3中!什么';什么是工作?

Wpf CollectionViewSource.GetDefaultView不在Silverlight 3中!什么';什么是工作?,wpf,silverlight,collections,silverlight-3.0,Wpf,Silverlight,Collections,Silverlight 3.0,Silverlight 3中没有CollectionViewSource.GetDefaultView()方法。在WPF中,我有以下扩展方法: public static void SetActiveViewModel<ViewModelType>(this ViewModelBase viewModel, ViewModelType collectionItem, ObservableCollection<ViewModelType> collectio

Silverlight 3中没有
CollectionViewSource.GetDefaultView()
方法。在WPF中,我有以下扩展方法:

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);
}
public static void SetActiveViewModel(此ViewModelBase viewModel,
ViewModelType集合项,
ObservableCollection集合),其中ViewModelType:ViewModelBase
{
Assert(collection.Contains(collectionItem));
ICollectionView collectionView=CollectionViewSource.GetDefaultView(集合);
如果(collectionView!=null)collectionView.MoveCurrentTo(collectionItem);
}

这是如何用Silverlight 3编写的?

您可以做的一件事是手动创建CollectionViewSource,将其Source属性设置为collection,然后使用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);
}
public static void SetActiveViewModel(此ViewModelBase viewModel,
ViewModelType集合项,
ObservableCollection集合),其中ViewModelType:ViewModelBase
{
Assert(collection.Contains(collectionItem));
CollectionViewSource CollectionViewSource=新的CollectionViewSource();
collectionViewSource.Source=集合;
ICollectionView collectionView=collectionViewSource.View;
如果(collectionView!=null)collectionView.MoveCurrentTo(collectionItem);
}

Silverlight不包含默认视图的概念。当您要求Silverlight中的控件绑定到集合时,它实际上绑定到集合,而不是绑定到默认视图

因此,我认为您的扩展方法不可能有一个直接和完整的端口。需要对MVVM实现进行一些重新设计。我以前没有遇到过视图模型实例集合的概念,所以我不确定什么适合您的情况


我在
CollectionViewSource
中看到的两种方法是在Xaml中定义
CollectionViewSource
,并将其
源绑定到ViewModel中的某些内容。或者,让ViewModel公开一个
CollectionViewSource
属性,并让视图xaml绑定到它的
View
项目。

这不起作用。因为您已经创建了CollectionViewSource的新实例,所以您将获得一个没有绑定任何内容的视图。因此,MoveCurrentTo不影响任何东西。在绑定到集合的WPF控件实际上将绑定到该集合的默认视图中,原始代码获取该默认视图并对其进行操作,从而影响绑定到该视图的任何内容。