在 App.xaml 中声明的 WPF 隐式数据模板不会生效



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的情况下使用的。

相关内容

  • 没有找到相关文章

最新更新