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

发布于 2024-11-18 14:05:18 字数 653 浏览 2 评论 0原文

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

对于这个场景有更好的想法吗?

In the MainWindow.xaml, I set:

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

In the App.xaml file, I added the following:

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

I was hoping the MainWindow will automatically load and show the MainView with its DataContext property set to the windows's one (which was set to MainViewModel at design-time as above), but it won't work - the MainWindow doesn't use the DataTemplate set in App.xaml.

Any better ideas for this scenario?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小ぇ时光︴ 2024-11-25 14:05:18

您应该进行一些小的更改 -

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

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

You should make a minor changes -

First, in your window. Try this:

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

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

This creates a single content item within your Window. DataTemplates work by mapping content to a new View - in this case, since the Content here is the MainViewModel, it will automatically create and instantiate a new MainView for you. Setting the DataContext will not trigger DataTemplates, since you're never making the ViewModel "content" of an object.

You can shorten this by just setting the Window's Content directly, if you prefer:

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

Or, even, binding the Content to the DataContext (though this only makes sense if you need the DataContext set for some other purpose):

<Window Content="{Binding}">
  <Window.DataContext>
    <vm:MainViewModel/>
  </Window.DataContext>
</Window>
不如归去 2024-11-25 14:05:18

我认为你需要

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

I think you need

<DataTemplate DataType="{x:Type vm:MainViewModel}">

EDIT:

I really don't think I'm wrong, the code

<Window.DataContext>
    <WpfApplication1:ViewModel />
</Window.DataContext>
<Window.Resources>
    <DataTemplate DataType="{x:Type WpfApplication1:ViewModel}">
        <TextBlock>Custom template</TextBlock>
    </DataTemplate>
</Window.Resources>
<ContentPresenter Content="{Binding}" />

shows “Custom template”. If I remove the x:Type, what's shown instead is “WpfApplication1.ViewModel”, which is the result of calling ToString() on the view model object. This is used in the absence of a DataTemplate.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文