让我们从模型的角度来审视这个问题:
假设我们有两种不同类型的视图,一种视图模型:
ViewA --> 使用DataTempate/DataTemplateSelector在项控件中创建,绑定到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;
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;
public ObservableCollection<PartyViewModel> PartiesViewModels { get { return _parties; } }
private void OnModelPartiesChanged(...)
{
}
}
public PhoneBook
{
public PhoneBook()
{
_parties = new ObservalbeCollection<Party>();
}
private ObservableCollection<Party> _parties;
public ObservableCollection<Party> Parties { get { return _parties; } }
}
public PersonViewModel : PartyViewModel
{
new Person DataContext { get; set; }
}
public PartyViewModel
{
public Party DataContext { get; set; }
}
然后您将获得每个模型项的正确类型的VM,视图将绑定到VM项而不是模型项。
视图的数据模板:
<DataTemplate x:Target={x:Type myVmNamespace:PersonViewModel}">
<PersonView/>
</DataTemplate>
<DataTemplate x:Target={x:Type myVmNamespace:GroupViewModel}">
<GroupView/>
</DataTemplate>
视图的ItemsControl:
<!
<!
<ListView ItemsSource={Binding Parties}"/>