为什么这个?
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)
这是我对比较的理解:
那么这是怎么回事?我不能只在XAML中构建窗口,通过VM的属性干净地访问其数据并完成操作吗?后面的代码是相同的(几乎为零)。
我正在努力理解为什么我应该将所有View内容改组为ResourceDictionary。
人们DataTemplates想根据ViewModel动态切换视图时使用这种方式:
DataTemplates
<Window> <Window.Resources> <DataTemplate DataType="{x:Type local:VM1}"> <!-- View 1 Here --> </DataTemplate> <DataTemplate DataType="{x:Type local:VM2}"> <!-- View 2 here --> </DataTemplate> </Window.Resources> <ContentPresenter Content="{Binding}"/> </Window>
所以,
如果Window.DataContext是的实例VM1,View1则将显示,
Window.DataContext
VM1
View1
而如果
Window.DataContext是的实例VM2,View2则将显示。
VM2
View2
当然,如果只需要1个View且永不更改,则毫无意义。