Я вижу представление как визуальное представление ViewModel, поэтому мне нравится, когда WPF выбирает представление на основе экземпляра ViewModel, который он хочет визуализировать.
Я называю это шаблоном View Locator, я использую этот метод для создания экземпляра моего представления, поскольку я считаю, что его очень просто реализовать.
Он в основном помещает запись в ResourceDictionary
вашего приложения, которая указывает WPF использовать IValueConverter для поиска и создания экземпляра View
при обнаружении ViewModel
.
Таким рабочим примером будет:
В вашем app.xaml:
<Application x:Class="MyApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml" >
<Application.Resources>
<ResourceDictionary Source="Resources.xaml"/>
</Application.Resources>
</Application>
В ресурсах. Xaml:
<DataTemplate DataType="{x:Type vm:ViewModelBase}">
<ContentControl Content="{Binding Converter={StaticResource ViewModelConverter}}"/>
</DataTemplate>
Установите DataContext
вашего окна управления, например,
public MainWindow : Window
{
InitializeComponent();
DataContext = new MainViewModel();
}
И ты почти закончил. Так что если у вас есть MainViewModel
, например, так:
public class MainViewModel : ViewModelBase
{
public ChildViewModel1 Child1 {get;set;}
public ChildViewModel2 Child2 {get;set;}
}
и у вас есть UserControl
, который преобразуется в MainViewModel
следующим образом:
<UserControl x:Class="MainView">
<StackPanel>
<ContentPresenter Content="{Binding Child1}"/>
<ContentPresenter Content="{Binding Child2}"/>
</StackPanel>
</UserControl>
Таким образом, ваш ViewModelConverter
вернет экземпляр соответствующего просмотра без каких-либо дополнительных усилий с вашей стороны.