2017-01-27 2 views
0

У меня есть GridView, извлеченный в отдельном пользовательском элементе управления без собственной модели просмотра или кода. Этот пользовательский элемент управления используется в двух разных представлениях, которые по умолчанию передают свой собственный контекст данных в представление.Общий интерфейс между ObservableCollection и ICollectionView

Думай о нем, как следующее:

управления пользователя

<DataGrid ItemsSource="{Binding Cars}" ... /> 

Просмотр 1

<LocalViews:CarsGrid /> 

Вид 1 модельное

... 
public ObservableCollection<Cars> Cars { get; } 
... 

View 2

<LocalViews:CarsGrid /> 

View 2 в модели

... 
public ICollectionView Cars { get; } 
... 

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

Я хотел извлечь общий интерфейс между двумя моделями просмотра, потому что я не чувствую себя комфортно, не имея никаких требований к (косвенной) модели представления, которая может быть привязана к этому пользовательскому элементу без контроля модели.

Проблема - я не смог найти общий базовый класс или интерфейс между ObservableCollection и ICollectionView. Является ли мой подход неправильным?

ответ

-1

Проблема - я не смог найти общий базовый класс или интерфейс между ObservableCollection и ICollectionView.

Что относительно IEnumerable?

+0

Не реализовано 'ObservableCollection'. Он реализует его общую версию - 'IEnumerable '. 'ICollectionView' имеет очень странную иерархию ... –

+0

ObservableColletion действительно также реализует не общий интерфейс IEnumerable.Это скомпилируется просто отлично: System.Collections.IEnumerable collecton = new ObservableCollection (); Попробуйте сами, и вы увидите :) – mm8

+0

IEnumerable должен быть (только) общим интерфейсом, который вы ищете здесь. – mm8

-1

Поскольку ObservableCollection - это коллекция, в то время как ICollectionView - это интерфейс для представления коллекции, у них нет общего интерфейса.

Вы должны использовать один из интерфейсов, который реализует ObservableCollection.

public ObservableCollection<Cars> Cars { get; } 
public ICollection<Cars> Cars { get; } //this is implemented by observablecollection 

Вы можете попробовать что-то вроде этого

VM1

private ObservableCollection<T> _cars; 
public IEnumerable Cars { get { return _cars; } } 

VM2

private List<T> _cars; 
public IEnumerable Cars { get { return _cars; } } 

Так как виртуальные машины обнажает тем же свойством.

Смежные вопросы