Tại sao là cái này?
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>
Thiết lập exampleView.xaml của bạn thành:
<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>
Và tạo cửa sổ như sau:
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();
}
}
Khi nào nó có thể được thực hiện như thế này?
App.xaml: (Đặt cửa sổ khởi động / Chế độ xem)
<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: (một Cửa sổ không phải là một 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>
Về cơ bản, đó là "View as DataTemplate" (VaD) so với "View as Window" (VaW)
Đây là hiểu biết của tôi về sự so sánh:
- VaD: Cho phép bạn chuyển đổi Chế độ xem mà không cần đóng cửa sổ. (Điều này không mong muốn cho dự án của tôi)
- VaD: VM hoàn toàn không biết gì về View, trong khi trong VaW, nó (chỉ) có thể khởi tạo nó khi mở một cửa sổ khác
- VaW: Tôi thực sự có thể thấy xaml của mình được hiển thị trong Trình thiết kế (tôi không thể với VaD, ít nhất là trong thiết lập hiện tại của tôi)
- VaW: Hoạt động trực quan với việc mở và đóng cửa sổ; mỗi cửa sổ có (là) một View tương ứng (và ViewModel)
- VaD: ViewModel có thể truyền theo chiều rộng, chiều cao, khả năng thay đổi kích thước của cửa sổ ban đầu, v.v. thông qua các thuộc tính (trong khi trong VaW, chúng được đặt trực tiếp trong Window)
- VaW: Có thể đặt FocusManager.FocusedElement (không chắc về cách thức trong VaD)
- VaW: Ít tệp hơn, vì các loại cửa sổ của tôi (ví dụ: Ribbon, Hộp thoại) được tích hợp vào Chế độ xem của chúng
Vậy điều gì đang xảy ra ở đây? Tôi không thể chỉ xây dựng các cửa sổ của mình trong XAML, truy cập dữ liệu của chúng một cách sạch sẽ thông qua các thuộc tính của máy ảo và được thực hiện với nó? Mã phía sau là như nhau (hầu như không).
Tôi đang đấu tranh để hiểu tại sao tôi nên xáo trộn tất cả các nội dung Chế độ xem vào một ResourceDictionary.