CollectionViewSource.GetDefaultView отсутствует в Silverlight 3! Какой обходной путь? - PullRequest
4 голосов
/ 28 марта 2010

Метод 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 голосов
/ 28 марта 2010

Silverlight не содержит концепцию представления по умолчанию. Когда вы запрашиваете элемент управления в Silverlight для привязки к коллекции, которую он действительно привязывает к коллекции, он не привязывается к представлению по умолчанию.

В результате я не думаю, что может быть прямой и полный порт вашего метода расширения. Потребуется некоторая реинжиниринг вашей реализации MVVM. Я раньше не сталкивался с концепцией коллекции экземпляров модели представления, поэтому не совсем уверен, что будет уместно в вашем случае.

Пара подходов, которые я видел с CollectionViewSource, состоит в том, чтобы либо определить CollectionViewSource, определенный в Xaml, и связать его Source с чем-то во ViewModel. Или же ViewModel предоставляет свойство CollectionViewSource и привязывает View xaml к его View proeprty.

1 голос
/ 28 марта 2010

Одна вещь, которую вы могли бы сделать, это вручную создать CollectionViewSource, установить его свойство Source для коллекции, а затем получить CollectionView, используя свойство View CollectionViewSource.

Что-то вроде этого может работать:

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