为什么会这样?
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:在打开和关闭窗口方面的工作方式很直观;每个窗口都有(即是)相应的 View(和 ViewModel)
- VaD:ViewModel 可以通过属性传递初始窗口宽度、高度、可调整大小等参数(而在 VaW 中则是直接在 Window 中设置)
- VaW:可以设置 FocusManager.FocusedElement(不确定在 VaD 中如何设置)
- VaW:文件更少,因为我的窗口类型(例如 Ribbon、对话框)已纳入它们的 View 中
那么这里发生了什么?我不能只是在 XAML 中构建我的窗口,通过 VM 的属性干净地访问它们的数据,然后就完成了吗?代码后台是一样的(几乎没有)。
我很难理解为什么要将所有视图内容都打包到 ResourceDictionary 中。