1

在 中MainWindow.xaml,我设置:

<Window.DataContext>
  <vm:MainViewModel/>
</Window.DataContext>

App.xaml文件中,我添加了以下内容:

<Application.Resources>
  <DataTemplate DataType="vm:MainViewModel">
    <v:MainView/>
  </DataTemplate>
</Application.Resources>

我希望它MainWindow会自动加载并显示MainViewDataContext属性设置为 windows 的属性(MainViewModel如上在设计时设置的),但它不起作用 -不MainWindow使用.DataTemplateApp.xaml

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

4

2 回答 2

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.

于 2011-07-05T16:13:26.623 回答
4

你应该做一个小的改变 -

首先,在您的窗口中。试试这个:

<Window>
  <!-- setup window... -->

  <ContentPresenter>
      <ContentPresenter.Content>
          <vm:MainViewModel/>
      </ContentPresenter.Content>
  </ContentPresenter>      
</Window>

这会在您的 Window 中创建单个内容项。DataTemplates 通过将内容映射到新视图来工作 - 在这种情况下,由于这里的内容是MainViewModel,它会自动为您创建和实例化一个新视图MainView。设置DataContextwill not trigger DataTemplates,因为您永远不会使 ViewModel 成为对象的“内容”。

如果您愿意,您可以通过直接设置窗口的内容来缩短它:

<Window>
  <Window.Content>
    <vm:MainViewModel/>
  </Window.Content>
</Window>

或者,甚至将内容绑定到(尽管这仅在您需要该集合用于其他目的DataContext时才有意义):DataContext

<Window Content="{Binding}">
  <Window.DataContext>
    <vm:MainViewModel/>
  </Window.DataContext>
</Window>
于 2011-07-05T16:17:42.687 回答