如何验证WPF绑定是否将数据绑定到实际属性?

5
我希望有一个简单的方法来确保我在XAML文件中声明的所有绑定都能到达实际属性。更好的是,我想在单元测试中实例化我的WPF窗口并调用一个方法来确保绑定是正确的。
不幸的是,即使我出现错误,WPF也不会抛出异常。这让我在QA阶段“发现”问题成为了负担。
有人知道我如何更好地验证我的绑定吗?
2个回答

4
一种次优的方法是遍历可视树以查找所有依赖属性,然后检查以下内容:
var bindingExpression = BindingOperations.GetBindingExpressionBase(dependencyObject, dependencyProperty);

if (bindingExpression != null)
{
    var status = bindingExpression.Status;
}

如果status未连接的,那么表达式没有被解析。当然,在生产应用程序中不应这样做,但在调试或集成测试场景中可能有意义。

1
数据绑定错误会显示在Visual Studio输出窗口中。例如,假设我想将TextBlock绑定到Window的Title属性,但我将“Title”误拼为“Ritle”。我会在输出窗口中看到以下内容:
System.Windows.Data Error: 39 : BindingExpression path error: 'Ritle' property not found on 'object' ''MessageWindow' (Name='Window')'. BindingExpression:Path=Ritle; DataItem='MessageWindow' (Name='Window'); target element is 'TextBlock' (Name='WindowTitle'); target property is 'Text' (type 'String')
您可以通过使用Trace Sources更好地控制这些消息的报告方式。Bea Stollnitz的这篇文章详细介绍了这一点。

我理解你的意思,但那并不能真正验证你的绑定。它只是提供了开发者需要仔细检查的调试信息。我认为尝试编写一个TraceListener,在“发现”绑定错误时抛出异常可能会比较脆弱,因为它必须解析可能随时改变的Microsoft消息。虽然可能比没有好些。 - Kent Boogaart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接