Давайте рассмотрим это с точки зрения модели:
<Ч />
Предположим, у нас есть 2 различных типа представлений, 1 тип модели представлений:
ViewA -> Создано в элементе управления с использованием DataTempate / DataTemplateSelector, Binded> to ViewModelA
ViewB -> Создано в элементе управления, используя DataTempate / DataTemplateSelector, привязанный к ViewModelA
Если оба вида привязаны к одной и той же модели вида, вы получите один и тот же вид.
<Ч />
Давайте попробуем еще раз с 2 различными типами представлений и 2 различными типами моделей представлений:
ViewA -> Создано в элементе управления с использованием DataTempate / DataTemplateSelector, привязано к ViewModelA -> Привязано к ModelA
ViewB -> Создано в элементе управления с использованием DataTempate / DataTemplateSelector, привязано к ViewModelB -> Привязано к ModelB
Это возможно.
<Ч />
Теперь, если вы моделируете свои модели вида и модели, подобные этой (псевдокод):
public PhoneBookViewModel
{
public PhoneBookViewModel()
{
_parties = new ObservalbeCollection<PartyViewModel>();
}
private PhoneBook _dataContext;
// This is the property the VM uses to access the model
public PhoneBook DataContext
{
get { return _dataContext; }
set
{
if (_dataContext != null)
{
_dataContext.Parties.CollectionChanged -= OnModelPartiesChanged;
}
_dataContext = value;
if (_dataContext != null)
{
_dataContext.Parties.CollectionChanged += OnModelPartiesChanged;
}
}
}
private ObservableCollection<PartyViewModel> _parties;
// This is the property the view uses to access the collection of VM parties
public ObservableCollection<PartyViewModel> PartiesViewModels { get { return _parties; } }
private void OnModelPartiesChanged(...)
{
// Add/remove VMs to/from PartiesViewModels here
}
}
// Model
public PhoneBook
{
public PhoneBook()
{
_parties = new ObservalbeCollection<Party>();
}
private ObservableCollection<Party> _parties;
// This is the property the VM uses to access the model's parties
public ObservableCollection<Party> Parties { get { return _parties; } }
}
public PersonViewModel : PartyViewModel
{
new Person DataContext { get; set; }
}
public PartyViewModel
{
public Party DataContext { get; set; }
}
тогда вы получите правильный тип виртуальных машин для каждого элемента модели,
представление будет привязано к элементам виртуальной машины, а не к элементам модели.
<Ч />
Таблицы данных вида:
<DataTemplate x:Target={x:Type myVmNamespace:PersonViewModel}">
<PersonView/>
</DataTemplate>
<DataTemplate x:Target={x:Type myVmNamespace:GroupViewModel}">
<GroupView/>
</DataTemplate>
Просмотр элементов управления:
<!-- Bind to Parties property of PhoneBookVM -->
<!-- Uses datatemplates for items -->
<ListView ItemsSource={Binding Parties}"/>