WPF MVVM ItemsControl с несколькими моделями представления в зависимости от типа объекта - PullRequest
2 голосов
/ 29 сентября 2010

У меня есть коллекция, которая содержит несколько типов элементов, которые все наследуются от одного и того же интерфейса. Это связано с ItemsControl. DataContext окна установлен на ViewModel, который содержит коллекцию.

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

Так что, если мои шаблоны в элементе управления настроены, как показано ниже, я бы хотел, чтобы первый шаблон имел DataContext из ViewModel1, а второй имел DataContext из ViewModel2. Я не могу установить DataContext непосредственно на них, потому что ItemsControl установит DataContext для элемента.

Кто-нибудь знает решение этой проблемы или лучший способ сделать это с помощью MVVM?

<DataTemplate DataType="{x:Type Models:ItemType1}">
    <Controls:MyControl Text="{Binding Body}"/>
</DataTemplate>

<DataTemplate DataType="{x:Type Models:ItemType2}">
    <Controls:MyControl2 Text="{Binding Body}"/>
</DataTemplate>

Ответы [ 2 ]

5 голосов
/ 29 сентября 2010

Почему бы вам просто не выставить коллекцию ViewModels?

var viewModels = new ObservableCollection<ViewModelBase>(items.Select(CreateViewModelFromItem));


private ViewModelBase CreateViewModelFromItem(Item item)
{
    if (item is ItemType1) return new ViewModel1((ItemType1)item);
    if (item is ItemType2) return new ViewModel2((ItemType2)item);
    ...
    throw new ArgumentException("Unknown model type");
}

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

1 голос
/ 29 сентября 2010

Может быть, вы могли бы использовать ValueConverter , который бы генерировал правильные ViewModel :

<DataTemplate DataType="{x:Type Models:ItemType1}">
    <Controls:MyControl DataContext="{Binding Converter=ViewModelLocator}" Text="{Binding Body}"/>
</DataTemplate>

Не уверен, что это может сработать, но стоит попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...