Wpf CollectionViewSource.GetDefaultView不在Silverlight 3中!什么';什么是工作?
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
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控件实际上将绑定到该集合的默认视图中,原始代码获取该默认视图并对其进行操作,从而影响绑定到该视图的任何内容。