Есть несколько способов справиться с этим, хотя я бы посмотрел на использование фреймворков, чтобы помочь вам с MVVM.Я сам продвигаю Prism .
Просмотр инъекций
Просмотр Discovery
DataTemplates - Образец
С DataTemplates вы определяете в XAML (или в коде, но XAML являетсяболее вероятно), какое представление «автоматически» применяется к ContentControl
на основе модели представления (DataContext).
Где-то в ресурсах XAML:
<DataTemplate DataType="{x:Type ViewModel:GeneralSettingsViewModel}">
<View:GeneralSettingsView/>
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModel:AdvancedSettingsViewModel}">
<View:AdvancedSettingsView/>
</DataTemplate>
Где-то в XAMLфайл, к которому применены ресурсы:
<TabControl ItemsSource="{Binding MyViewModelCollection}" />
Примечание. Это работает, только если у вас есть одна модель представления на шаблон данных в ресурсе с заданной областью.
DataTemplateSelector
Если у вас есть модель представления, которую можно применить к нескольким представлениям, и вы определяете эти представления с помощью дополнительной логики, вам следует использоватьDataTemplateSelector
.Вот пример:
Где-то в ресурсах XAML:
<!-- Possible collision because the DataType is of the same type -->
<DataTemplate x:Key="GeneralSettingsTemplate"
DataType="{x:Type ViewModel:SettingsViewModel}">
<View:GeneralSettingsView/>
</DataTemplate>
<DataTemplate x:Key="AdvancedSettingsTemplate"
DataType="{x:Type ViewModel:SettingsViewModel}">
<View:AdvancedSettingsView/>
</DataTemplate>
<local:SettingsDataTemplateSelector x:Key="SettingsTemplateSelector"
GeneralSettingsTemplate="{StaticResource GeneralSettingsTemplate}"
AdvancedSettingsTemplate="{StaticResource AdvancedSettingsTemplate}" />
Где-то в файле XAML, к которому применены ресурсы:
<TabControl ItemsSource="{Binding MyViewModelCollection}"
ItemTemplateSelector="{StaticResource SettingsTemplateSelector}" />
SettingsTemplateSelector.cs:
public class SettingsDataTemplateSelector : DataTemplateSelector
{
public DataTemplate GeneralSettingsTemplate { get; set; }
public DataTemplate AdvancedSettingsTemplate { get; set; }
public override DataTemplate SelectTemplate(Object item,
DependencyObject container)
{
var vm = item as SettingsViewModel;
if (vm == null) return base.SelectTemplate(item, container);
if (vm.IsAdvanced)
{
return AdvancedSettingsTemplate;
}
return GeneralSettingsTemplate;
}
}
MSDN: навигация по призме - http://msdn.microsoft.com/en-us/library/gg430861(v=PandP.40).aspx
Это охватывает регионы Prism, а также другие части навигации.
MSND: просмотр Discovery vsView Injection - http://msdn.microsoft.com/en-us/library/ff921075(v=pandp.20).aspx
В этом разделе рассматриваются различия между View Discovery и View Injection, и когда их использовать.