CollectionViewSource.GetDefaultView在Silverlight 3中不存在!有什么解决方法吗?

4

CollectionViewSource.GetDefaultView() 方法在 Silverlight 3 中不可用。 在 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);
}

这在Silverlight 3中应该怎么写?
2个回答

2
银光并不包含默认视图的概念。当你要求银光控件绑定到一个集合时,它实际上会绑定到该集合,而不是绑定到默认视图。
因此,我认为你的扩展方法不能直接完全移植。需要重新设计MVVM实现。我以前从未遇到过视图模型实例的集合概念,因此不确定在你的情况下应该采用什么方法。
我见过一些使用CollectionViewSource的方法,其中一种方法是在Xaml中定义CollectionViewSource,并将其Source绑定到ViewModel中的某些内容。另一种方法是让ViewModel公开一个CollectionViewSource属性,并让View xaml绑定到其View属性。

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);
}

这个不起作用。因为你创建了一个新的CollectionViewSource实例,所以你会得到一个没有绑定任何内容的View。因此,MoveCurrentTo不会产生任何影响。在WPF控件中,绑定到集合的控件实际上是绑定到该集合的默认视图,原始代码获取了该默认视图并对其进行操作,从而影响到任何与之绑定的内容。 - AnthonyWJones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接