Почему это?
MainWindow.xaml:
<Window x:Class="MVVMProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<ContentControl Content="{Binding}"/>
</Grid>
</Window>
Настройте свой ExampleView.xaml как:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vms="clr-namespace:MVVMProject.ViewModels">
<DataTemplate DataType="{x:Type vms:ExampleVM}" >
<Grid>
<ActualContent/>
</Grid>
</DataTemplate>
</ResourceDictionary>
И создайте такое окно:
public partial class App : Application {
protected override void OnStartup(StartupEventArgs e) {
base.OnStartup(e);
MainWindow app = new MainWindow();
ExampleVM context = new ExampleVM();
app.DataContext = context;
app.Show();
}
}
Когда это можно сделать так?
App.xaml: (Установить окно запуска / Просмотр)
<Application x:Class="MVVMProject.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="ExampleView.xaml">
</Application>
ExampleView.xaml: (Окно, а не ResourceDictionary)
<Window x:Class="MVVMProject.ExampleView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vms="clr-namespace:MVVMProject.ViewModels">
>
<Window.DataContext>
<vms:ExampleVM />
</Window.DataContext>
<Grid>
<ActualContent/>
</Grid>
</Window>
По сути, это «Просмотр как шаблон данных» (VaD) против «Просмотр как окно» (VaW).
Вот мое понимание сравнения:
- VaD: позволяет переключать просмотры, не закрывая окно. (Это нежелательно для моего проекта)
- VaD: VM абсолютно ничего не знает о View, тогда как в VaW он (только) должен иметь возможность создавать его при открытии другого окна.
- VaW: я действительно могу видеть свой xaml, отображаемый в конструкторе (я не могу с VaD, по крайней мере, в моей текущей настройке)
- VaW: Интуитивно работает с открытием и закрытием окон; каждое окно имеет (есть) соответствующий View (и ViewModel)
- VaD: ViewModel может передавать исходную ширину окна, высоту, возможность изменения размера и т. Д. Через свойства (тогда как в VaW они устанавливаются непосредственно в окне)
- VaW: можно установить FocusManager.FocusedElement (не уверен, как в VaD)
- VaW: меньше файлов, так как мои типы окон (например, лента, диалог) включены в их представления.
Так что здесь происходит? Разве я не могу просто создать свои окна в XAML, получить чистый доступ к их данным через свойства виртуальной машины и покончить с этим? Код программной части такой же (практически ноль).
Я изо всех сил пытаюсь понять, почему я должен перетасовать все материалы View в ResourceDictionary.