在App.xaml中声明的WPF隐式DataTemplate不会生效

时间:2011-07-05 16:11:00

标签: wpf datatemplate app.xaml

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

对于这种情况有什么更好的想法吗?

2 个答案:

答案 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>