在开发 WPF 程序,虽然 xaml 很好用,但是经常会出现小伙伴把绑定写错了。因为默认的 VisualStudio 是没有自动提示,这时很容易复制粘贴写出一个不存在的属性。
在 xaml 如果绑定失败了,那么内部会有一个异常,但是 WPF 不会把这个异常抛出来,这个异常也不会让用户拿到,只是会在输出窗口提示。但是异常会影响性能,而且会让界面和设计的不一样,所以我就想在找到绑定异常就抛出,弹出窗口告诉小伙伴。
本文会告诉大家如何找到绑定失败,并且抛出异常,如何防止修改属性名让xaml绑定失败。
在绑定失败异常建议只在调试下抛出,抛出异常建议弹出,告诉开发者现在你的界面有绑定异常
拿到绑定信息
先来写简单的代码,做一个 ViewModel ,里面有两个属性
可以看到第二个属性是比较复杂的,现在来写 xaml 界面,
然后在后台代码添加这个代码
现在运行一下,你猜是不是会显示两行,一行是 lindexi 一行是 lindexi.gitee.io ,实际上你看到只有一行,因为第二个绑定写错了
第二个在 ViewModel 的属性是 JaslorbafelStojou 但是 xaml 写的是 JaslorbafelStoj ,如果这时看到了输出,就会看到下面代码
那么这个代码是否可以用来判断出现绑定失败,是的,让我来告诉大家如何拿到输出
转发绑定
因为绑定失败输出是使用 Trace ,关于 Trace 请看WPF 调试 获得追踪输出
那么如何拿到 Trace 的输出?
首先需要定义一个类继承 TraceListener ,下面定义一个 BindingErrorTraceListener 收到了消息就输出
然后在构造函数加入,注意在 InitializeComponent 之前
这时运行代码可以看到输出
所以很容易就知道如何判断是绑定输出
绑定失败异常
从上面代码可以知道,所有的绑定输出可以PresentationTraceSources.DataBindingSource.Listeners
拿到,重写方法就可以转发
而且 TraceListener 是一个很强的类,支持了很多输入,不只字符串,还支持 object ,所以尝试使用 TraceListener 可以做到比较好调试
因为需要在失败抛出异常,就需要定义一个异常
判断当前存在绑定失败很简单,主要使用正则判断
这时会发现代码抛出异常
但是抛出了异常建议弹出窗口,这样开发者才会看到
自动提示
我找到绑定失败很多是因为写错了属性,很多小伙伴不知道实际 xaml 是可以自动提示。
先在 对应的窗口写入绑定的类型,使用d:DataContext
可以告诉 xaml 使用的数据类型,这样做绑定就可以自动提示
这时尝试删除 JaslorbafelStoj 重新写,就会提示 需要写 JaslorbafelStojou ,这样会自动提示就很难写错。
我很建议大家安装 Resharper 这样在修改变量名时,会自动修改 xaml 的属性名
在有安装 Resharper 的设备,修改一个属性名,然后按 Alt+enter 就会提示 apply rename factoring ,这样会修改所有引用这个属性的变量名
需要注意,必须添加 d:DataContext
或者这样设置 ViewModel 才可以通过 Resharper 修改变量名
如果需要调试 Binding ,参见 WPF 如何调试 binding
参见:
#1,208 – Catching Data Binding Errors Part 1
原文链接: http://blog.lindexi.com/post/WPF-%E5%A6%82%E4%BD%95%E5%9C%A8%E7%BB%91%E5%AE%9A%E5%A4%B1%E8%B4%A5%E5%BC%82%E5%B8%B8
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。