【问题标题】:Why does my WPF view not work without code-behind when applied through a DataTemplate?为什么我的 WPF 视图在通过 DataTemplate 应用时在没有代码隐藏的情况下无法工作?
【发布时间】:2011-05-03 16:48:33
【问题描述】:

我正在使用 MVVM 开发一个大型 WPF 项目。我们目前仍在决定我们将在多大程度上使用代码隐藏,但到目前为止,我们相处得很好,根本没有(Windows 上的 InitializeComponent 除外)。但是,我最近开始使用类型化的 DataTemplates 将视图应用到我的视图模型,并且似乎这些视图(如窗口)在没有 InitializeComponent 调用的情况下无法工作,而根据this 文章,我认为它们可以。 DataTemplate 只是声明一个视图。当我删除视图的代码隐藏文件时,视图模型呈现完全空白。当我把它留在里面时,它很好。任何想法为什么我可能会看到这种行为?

【问题讨论】:

    标签: wpf mvvm datatemplate viewmodel code-behind


    【解决方案1】:

    首先,您可能忽略了一些重要的事情:我在学习 MVVM/WPF 时也大量使用了那篇文章,但我从未想过它建议从 View.cs 中消除 InitializeComponent 调用。

    事实上,快速搜索会发现以下内容(在 Relaying Command Logic 下)[强调我的]:

    应用程序中的每个视图都有一个空的 代码隐藏文件,除了 调用的标准样板代码 在类的 InitializeComponent 构造函数。

    我一直在应用您描述的相同模式,同时为每个视图保留默认代码隐藏,到目前为止一切顺利。 :)

    进一步:如果您查看默认 InitializeComponent() 的定义,您会看到生成的代码包含以下语句:

    System.Windows.Application.LoadComponent(this, resourceLocater);

    我还没有进行测试以确保是这种情况,但我会用金子打赌你的灵魂,阻止该行执行会影响你的视图渲染......;)

    【讨论】:

    • 感谢您的回复!如果需要使事情顺利进行,我绝对很高兴将代码隐藏文件保留在适当的位置,并且我同意它会在不运行您发布的行的情况下工作似乎很奇怪。但是,您在文章中遗漏了非常重要的一行,紧接在您引用的那一行之后:
    • “事实上,您可以从项目中删除视图的代码隐藏文件,应用程序仍然可以正确编译和运行。” 您可以下载并测试他的解决方案,然后它确实可以在没有 .cs 文件的情况下工作。所以我真的很想知道为什么它在他的情况下有效,而不是在我的情况下,因为我相信至少答案会告诉我这一切是如何运作的。
    • @sou 你说得对,他确实这么说,我错过了...但是我复制了演示应用程序并删除了所有客户和新客户的代码隐藏文件视图,尽管应用程序编译并运行,但视图没有呈现!在你、乔希和我之间,至少我们中的一个人一定是错过了什么...... :)
    • 等等等等……我们在想什么?当然是 StackOverflow already has the answer!也就是说,经过最少的摆弄,我也不确定它是否有效。如果有帮助,请告诉我!
    • 嗯,你是对的!可以发誓我以前让它工作过。它在没有代码隐藏文件的情况下运行,但选项卡为空白。我想这是不可能的,我不确定作者为什么声称它是。关于其他 Stack Overflow 链接,如果您将视图模型外观的 XAML 直接放在 标记中,则不需要其他文件或代码隐藏。但是一旦你把它分解成一个 UserControl (这是很好的清理东西并将相关的样式等放在一起),它就是必需的。至少现在我知道并且我可以保留这些文件。谢谢!
    【解决方案2】:

    根据 djacobson 的说法,即使我在问题中引用的 Josh Smith 的解决方案也无法在没有代码隐藏的情况下呈现其观点,因此说明可以做到这一点的行具有误导性。似乎避免视图代码隐藏的唯一方法是根本不将它们放入 UserControls 中,而只是将 XAML 直接保存在 标记中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-05
      • 2015-09-06
      • 2012-10-14
      • 2019-02-27
      • 1970-01-01
      • 2015-06-18
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多