Dlaczego to?
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>
Ustaw plik ExampleView.xaml jako:
<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>
I utwórz okno w ten sposób:
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();
}
}
Kiedy można to zrobić w ten sposób?
App.xaml: (Ustaw okno startowe / Widok)
<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: (okno, a nie 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>
Zasadniczo jest to „Wyświetl jako szablon danych” (VaD) a „Wyświetl jako okno” (VaW)
Oto moje rozumienie porównania:
- VaD: Umożliwia przełączanie widoków bez zamykania okna. (Nie jest to pożądane w moim projekcie)
- VaD: VM nie wie absolutnie nic o widoku, podczas gdy w VaW musi (tylko) mieć możliwość jego instancji podczas otwierania innego okna
- VaW: Faktycznie widzę mój Xaml renderowany w Projektancie (nie mogę z VaD, przynajmniej w mojej obecnej konfiguracji)
- VaW: działa intuicyjnie przy otwieraniu i zamykaniu okien; każde okno ma (jest) odpowiadający mu Widok (i ViewModel)
- VaD: ViewModel może przechodzić wzdłuż początkowej szerokości okna, wysokości, możliwości zmiany rozmiaru itp. Poprzez właściwości (podczas gdy w VaW są one ustawiane bezpośrednio w oknie)
- VaW: można ustawić FocusManager.FocusedElement (nie wiem jak w VaD)
- VaW: Mniej plików, ponieważ moje typy okien (np. Wstążka, Okno dialogowe) są włączone do ich widoków
Więc co się tutaj dzieje? Czy nie mogę po prostu zbudować moich okien w XAML, uzyskać czysty dostęp do ich danych poprzez właściwości maszyny wirtualnej i skończyć z tym? Kod jest taki sam (praktycznie zerowy).
Usiłuję zrozumieć, dlaczego powinienem przetasować wszystkie elementy widoku do ResourceDictionary.