Чому це?
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: (вікно, а не ресурсний словник)
<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: працює інтуїтивно з відкриванням і закриванням вікон; кожне вікно має (є) відповідний вигляд (і ViewModel)
- VaD: ViewModel може проходити по початковій ширині вікна, висоті, зміні розміру тощо через властивості (тоді як у VaW вони встановлюються безпосередньо у Вікні)
- VaW: може встановити FocusManager.FocusedElement (не знаю, як у VaD)
- VaW: Менше файлів, оскільки мої типи вікон (наприклад, стрічка, діалогове вікно) включені в їх подання
То що тут відбувається? Чи не можу я просто побудувати свої вікна в XAML, отримати доступ до їх даних чисто через властивості віртуальної машини і закінчити з цим? Код позаду той самий (практично нульовий).
Я намагаюся зрозуміти, чому я повинен перемішувати всі матеріали View у ResourceDictionary.