在MainWindow.xaml
中,我设置:
<Window.DataContext>
<vm:MainViewModel/>
</Window.DataContext>
在App.xaml
文件中,我添加了以下内容:
<Application.Resources>
<DataTemplate DataType="vm:MainViewModel">
<v:MainView/>
</DataTemplate>
</Application.Resources>
我希望MainWindow
会自动加载并显示MainView
,其DataContext
属性设置为windows的属性(如上所述,在设计时设置为MainViewModel
(,但它不起作用——MainWindow
没有使用App.xaml
中设置的DataTemplate
。
有什么更好的想法吗?
您应该做一些小的更改-
首先,在你的窗户里。试试这个:
<Window>
<!-- setup window... -->
<ContentPresenter>
<ContentPresenter.Content>
<vm:MainViewModel/>
</ContentPresenter.Content>
</ContentPresenter>
</Window>
这将在您的窗口中创建单个内容项。DataTemplates通过将内容映射到一个新视图来工作-在这种情况下,由于这里的内容是MainViewModel
,它将自动为您创建并实例化一个新的MainView
。设置DataContext
不会触发DataTemplates
,因为您永远不会使ViewModel成为对象的"内容"。
您可以通过直接设置窗口的内容来缩短此时间,如果您喜欢的话:
<Window>
<Window.Content>
<vm:MainViewModel/>
</Window.Content>
</Window>
或者,甚至将内容绑定到DataContext
(尽管只有当您出于其他目的需要DataContext
集时,这才有意义(:
<Window Content="{Binding}">
<Window.DataContext>
<vm:MainViewModel/>
</Window.DataContext>
</Window>
我想你需要
<DataTemplate DataType="{x:Type vm:MainViewModel}">
编辑:
我真的不认为我错了,代码
<Window.DataContext>
<WpfApplication1:ViewModel />
</Window.DataContext>
<Window.Resources>
<DataTemplate DataType="{x:Type WpfApplication1:ViewModel}">
<TextBlock>Custom template</TextBlock>
</DataTemplate>
</Window.Resources>
<ContentPresenter Content="{Binding}" />
显示"自定义模板"。如果删除x:Type
,则显示的是"WpfApplication1.ViewModel",这是在视图模型对象上调用ToString()
的结果。这是在没有DataTemplate
的情况下使用的。