在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
不使用DataTemplate
中设置的App.xaml
。
对于这种情况有什么更好的想法吗?
答案 0 :(得分:4)
我认为你需要
<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
的情况下使用。
答案 1 :(得分:4)
你应该做一些小改动 -
首先,在你的窗口。试试这个:
<Window>
<!-- setup window... -->
<ContentPresenter>
<ContentPresenter.Content>
<vm:MainViewModel/>
</ContentPresenter.Content>
</ContentPresenter>
</Window>
这会在您的Window中创建一个内容项。 DataTemplates通过将内容映射到新视图来工作 - 在这种情况下,由于此处的内容是MainViewModel
,它将自动为您创建并实例化新的MainView
。设置DataContext
不会触发DataTemplates
,因为您永远不会创建对象的ViewModel“内容”。
如果您愿意,可以直接设置Window的内容来缩短:
<Window>
<Window.Content>
<vm:MainViewModel/>
</Window.Content>
</Window>
或者,甚至将内容绑定到DataContext
(尽管只有在出于某些其他目的需要DataContext
时才有意义):
<Window Content="{Binding}">
<Window.DataContext>
<vm:MainViewModel/>
</Window.DataContext>
</Window>