Wpf绑定:如何在设计时避免“未找到属性”运行时错误

Wpf绑定:如何在设计时避免“未找到属性”运行时错误,wpf,testing,Wpf,Testing,我希望以某种方式确保xaml中的所有绑定都绑定到现有属性 我希望避免如下运行时错误: BindingExpression path error: 'Fullname' property not found on 'object' ''Person' (HashCode=33132859)'. BindingExpression:Path=Person.Fullname; DataItem='ViewModel' (HashCode=46007650); target element is 'T

我希望以某种方式确保xaml中的所有绑定都绑定到现有属性

我希望避免如下运行时错误:

BindingExpression path error: 'Fullname' property not found on 'object' ''Person' (HashCode=33132859)'. 
BindingExpression:Path=Person.Fullname; DataItem='ViewModel' (HashCode=46007650); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
每个视图都使用d:DesignInstance指定了datacontext类型,如果不能从上下文继承,则每个DataTemplate都使用DataType属性,例如ListBoxItem模板

在VisualStudioXAML设计器中,无效属性会加下划线,并且在运行时,在输出窗口中会出现绑定错误

是否有任何工具可以检查这些错误?我在考虑一些自动化的UI测试,这将贯穿整个应用程序并检查调试输出,但设置起来相当困难

如果resharper能够解析xaml并识别无效绑定,那么至少在理论上可以在代码分析或单元测试中这样做

编辑: 我向uservoice添加了建议: 请投票

我喜欢这个解决方案: . 每次绑定失败时,您都会收到一条弹出消息

编辑:根据请求,以下是BindingErrorTraceListener的源代码,由编写,包括通过Dispatcher将MessageBox发送到GUI线程的错误修复

using System.Diagnostics;
using System.Text;
using System.Windows;

namespace SOTC_BindingErrorTracer
{
  public class BindingErrorTraceListener : DefaultTraceListener
  {
    private static BindingErrorTraceListener _Listener;

    public static void SetTrace()
    { SetTrace(SourceLevels.Error, TraceOptions.None); }

    public static void SetTrace(SourceLevels level, TraceOptions options)
    {
      if (_Listener == null)
      {
        _Listener = new BindingErrorTraceListener();
        PresentationTraceSources.DataBindingSource.Listeners.Add(_Listener);
      }

      _Listener.TraceOutputOptions = options;
      PresentationTraceSources.DataBindingSource.Switch.Level = level;
    }

    public static void CloseTrace()
    {
      if (_Listener == null)
      { return; }

      _Listener.Flush();
      _Listener.Close();
      PresentationTraceSources.DataBindingSource.Listeners.Remove(_Listener);
      _Listener = null;
    }



    private StringBuilder _Message = new StringBuilder();

    private BindingErrorTraceListener()
    { }

    public override void Write(string message)
    { _Message.Append(message); }

    public override void WriteLine(string message)
    {
      _Message.Append(message);

      var final = _Message.ToString();
      _Message.Length = 0;

      Application.Current.Dispatcher.BeginInvoke(
          System.Windows.Threading.DispatcherPriority.Normal, 
          new System.Windows.Threading.DispatcherOperationCallback(delegate { MessageBox.Show(final, "Binding Error", MessageBoxButton.OK, 
        MessageBoxImage.Error); return null; }), 
          null);
    }
  }
}
然后,在窗口或视图基类中,添加行

BindingErrorTraceListener.SetTrace();

打开弹出窗口。

我正要编写自己的跟踪侦听器。这确实节省了我几个小时,谢谢!现在,我需要了解如何在集成测试中关闭所有视图及其视图模型,并在出现绑定错误时使测试失败。。。但是你能把实际的代码移到答案中,这样我们就不会因为链接腐烂而丢失它吗?在代码内联之后,我很乐意+1这个答案。别忘了包括态度。