【问题标题】:WPF BindingExpression System.Windows.Data Error: Need filename or class name (Dependency Injection/MEF)WPF BindingExpression System.Windows.Data 错误:需要文件名或类名(依赖注入/MEF)
【发布时间】:2019-08-09 22:14:15
【问题描述】:

有没有办法在这些错误发生时查看正在实例化哪个 UserControl/Window/etc?

一个典型的错误如下所示:

System.Windows.Data Error: 40 : BindingExpression path error: 'BackgroundColor' property not found on 'object' ''MapContainerViewModel' (HashCode=25350572)'. BindingExpression:Path=BackgroundColor; DataItem='MapContainerViewModel' (HashCode=25350572); target element is 'SolidColorBrush' (HashCode=35109313); target property is 'Color' (type 'Color')

问题?它发生在哪里?在哪个 XAML 文件中?在哪个班?

你得到一个症状列表,却没有病人的名字,这不是很奇怪吗?

在一个小项目中,我可能会知道去哪里找。我目前正在重构一个包含数百个 Windows/UserControls 的 MVVM 项目,其中许多具有相似的绑定路径。

所以我必须对属性名称进行“整个解决方案”搜索,并提供一个候选列表(UserControls/Windows),这些候选对象在实例化时可能会导致绑定错误。

另一个选项是让 Visual Studio 中断并在发生 System.Windows.Data 错误时立即向我显示 XAML。遵循this one 之类的教程,我可以破解代码——但它不指示任何 XAML 或类名。堆栈跟踪没有显示任何内容——因为控件是通过 MEF 自动创建的。

感谢您的帮助。 乍得。

更新:

Live Visual Tree 在这种情况下不起作用,因为有问题的 UserControls/Windows 位于 MEF 容器中并且没有附加。

任何可视化方法都不起作用,因为视图/数据上下文(在本例中为视图模型)是通过 MEF(DI 模式)实例化的,并且正在等待添加到可视化树中。

【问题讨论】:

    标签: wpf mvvm data-binding visual-studio-2015 visual-studio-debugging


    【解决方案1】:

    调试器不会在 XAML 方面为您提供太多帮助。这是因为 XAML 是声明性的,而调试器是为命令式代码设计的。对于 WPF,您需要依赖不同的工具集,特别是 VS2017 中的 Live Visual Tree 和 Live Property Explorer。

    这是一个带有几个文本框控件的简单 WPF 应用程序。

    其中一个文本框控件不起作用。我如何找到它?首先打开 Live 可视化树。单击 WPF 工具栏中的启用选择按钮(第二个按钮)。然后选择不工作的控件。实时可视化树将选择控件。

    现在选择 Live Visual Tree (FirstValueField) 中的 TextBox 父控件。现在打开 Live Property Explorer。

    注意 Text 属性周围的黄色框。这就是错误所在。单击属性字段右侧的 并选择“转到源”。

    所以这就是错误所在。您可以看到我在哪里更改了代码以引入错误。

    这是调试 WPF、XAML 或任何声明性代码的一般方法:(1) 放弃调试器...它只会妨碍您; (2) 学习如何使用适合的工具来查找错误; (3) 如果这不起作用,请使用打印语句。

    根据我的经验,WPF 工具非常适合查找常见错误。然而,您的 WPF 变得越复杂,您就越需要嵌入代码来诊断和识别问题。

    【讨论】:

    • 谢谢。这在不同的情况下可能很有用。不过我的情况有点不同。该应用程序似乎通过在显示主窗口之前迭代导入的 Lazy 列表来实例化所有控件,然后再显示它们。并未显示所有控件;但我认为这样做的原因是,一旦需要特定控件,应用程序就会显示它。在这种情况下,您在此处描述的方式没有多大帮助,因为发生错误时控件根本不会显示。不过谢谢。
    • 我的建议成立。您需要使用 Live Visual Tree 和 Live Property Explorer 来查找问题。无论控件是否可见,Live Visual Tree 都会显示它们。您的评论似乎暗示您正在寻找另一种诊断问题的方法。没有别的办法。
    • 如有误会,敬请谅解;当没有可见的窗口时,我还没有看到这些工具运行。如果控件只是存在于 MEF 容器中并且没有显示,它们将如何显示在可视树中?
    • 我想你不明白。控件未附加到任何可见窗口的任何位置。他们没有倒塌;他们没有隐藏。它们作为尚未渲染的对象位于 MEF 容器中。我可以通过显示所有 100 个左右的控件来抓住罪魁祸首的过程,但正如我之前所说的那样,这样做会更容易——只需查看 Binding 属性,搜索可能匹配的解决方案,然后找到控件/窗户那样。 System.Windows.Data 错误不会在错误本身中给出 Window/User 控件的名称,这似乎很奇怪。
    • 作为记录,我确实尝试了 Visual Tree 方法。没有骰子。什么都没有显示,因为没有任何东西附加到主窗口。用截图更新了问题。
    猜你喜欢
    • 2015-08-11
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多