如何找到绑定错误的来源?

时间:2011-12-12 20:43:56

标签: wpf xaml binding .net-4.0

如何判断xaml的哪一行包含麻烦的绑定当我的调试输出中充满了如下所示的行:

System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='UW.Entities.ProgramModel.UWProgram' BindingExpression:Path=; DataItem='RuntimeType' (HashCode=24995901); target element is 'DataGridCollectionViewSource' (HashCode=60976864); target property is 'Source' (type 'Object')

我不知道如何解释这个问题可以让我找到负责任的xaml行。我甚至无法弄清楚错误来自哪个xaml文件。有没有办法在发生这些错误时获取更多信息?

'UW.Entities.ProgramModel.UWProgram'只是一种类型 - 我不知道被绑定的对象是什么。我在xaml的各个位中也有很多DataGridCollectionViewSources,所有属性'Source'都绑定到可能有或没有那种类型的东西(再次 - 没有简单的方法可以告诉)。

5 个答案:

答案 0 :(得分:24)

如果您不知道哪个绑定失败

我会将Snoop utility用于此目的。简而言之 - 在可视化树上方的左上角,您将找到一个允许过滤视觉效果的下拉列表,只需选择带有绑定错误的视觉效果。有关详细信息,请参阅online documentation

如果您知道哪个绑定失败

有时你知道哪个绑定失败但是找不到问题的来源,因为绑定非常棘手,例如TemplateBindings,绑定引用另一个控件的DataContext等等。我发现有用的放置{{ 1}}哪个Text属性以这种方式绑定到同一个绑定源,你可以看到什么是完全绑定的,因为TextBlock将显示绑定对象的类型名称。

例如,您有以下失败的绑定:

TextBlock

有用的链接:

答案 1 :(得分:11)

自从2009年首次发布以来,我一直很乐意使用“启动代码”中的精彩片段来检测和报告绑定错误...

http://www.switchonthecode.com/tutorials/wpf-snippet-detecting-binding-errors

编辑:在VS2012(2013年9月)上仍然表现出色

2016年1月25日更新

链接显示已损坏,因此我会粘贴相关的摘要...

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

namespace SOTC_BindingErrorTracer
{
    public class BindingErrorTraceListener : DefaultTraceListener
    {   //http://www.switchonthecode.com/tutorials/wpf-snippet-detecting-binding-errors
        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;

            MessageBox.Show(final, "Binding Error", MessageBoxButton.OK,
              MessageBoxImage.Error);
        }
    }
}

并设置/初始化它......

namespace WpfListeningForTraceErrors
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            BindingErrorTraceListener.SetTrace();
            InitializeComponent();
        }
    }
}

答案 2 :(得分:4)

您可以将其添加到每个绑定的控件

  PresentationTraceSources.TraceLevel="High" 

在调试中运行程序,详细的绑定信息将出现在“输出”窗口中。它可能会有所帮助。您还可以创建一个pass through转换器来捕获错误(有时会捕获问题,但并非总是如此)。我知道没有很好的调试XAML的好工具。

答案 3 :(得分:1)

您可以下载一个名为Snoop的工具,它允许您调试绑定。它提供了WPF应用程序可视树的视图,高亮显示了它找到的任何绑定错误。

您可以在Visual Studio的“输出”窗口中获取有关绑定错误的一些基本信息。它将显示绑定表达式路径错误和发生错误的行。

答案 4 :(得分:0)

在VisualStudio中,转到“工具”->“扩展和更新”->(下载Output Enhancer)。构建解决方案时,如果出现绑定错误,您将获得确切的错误消息,并以红色显示。

Output enhancer