如何定位绑定错误的源头?

22
我该如何确定哪一行xaml包含有问题的绑定?当我的调试输出充斥着以下信息时:

System.Windows.Data Error: 5 : BindingExpression生成的值对于目标属性无效。; 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个回答

29

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

我建议使用Snoop实用工具来解决这个问题。简单来说,在可视树的左上角,您将找到一个下拉列表,允许筛选可视化元素,只需选择带有绑定错误的可视化元素。请参阅在线文档以获取更多详细信息。

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

有时您知道哪个绑定失败了,但无法找到问题的源头,因为绑定非常棘手,例如TemplateBindings,引用另一个控件的DataContext的绑定等等。我发现在放置一个TextBlock,其Text属性与相同的绑定源绑定可帮助您查看绑定的内容,因为TextBlock将显示绑定对象的类型名称。

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

<ItemsControl ItemsSource="{Binding Parent.DataContext.ActiveItem.DataContext}" />

<!-- See what is bound, if failed - try previous level  -->
<TextBlock Text="{Binding Parent.DataContext}" />
<TextBlock Text="{Binding Parent.Inner.Items}" />
<TextBlock Text="{Binding Parent.Inner}" />

相关链接:


我的个人经验是,Snoop有很多承诺,但有时可能会变成一堆垃圾。我肯定不会依赖它。(关于你的回答没有任何个人问题,只是Snoop不可靠)。 - slugster
1
我需要克服一些学习曲线 - 但我可以告诉这个工具将是无价的。谢谢。 - Alain
3
对于未来的读者,“绑定错误的可视化”选项位于Snoop 2.8中的顶部左侧下拉菜单中,而不是顶部右侧。 - dotNET

13

自从2009年“Switch on the Code”首次发布了一个精彩的片段用于检测和报告绑定错误,我一直很高兴地使用它...

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

编辑:在2013年9月,它仍然可以在VS2012上出色地工作。

更新于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();
        }
    }
}

1
这个完全非常棒。在VS2013上仍然表现出色(2014年1月)。 - Contango
很好实际包含代码片段,因为现在该链接已经失效,你的回答只会浪费人们的时间。 - user3690202
4
仍不能告诉我文件名或行号。 - Simon_Weaver
如果您的应用程序有许多绑定错误(我怀疑这就是人们来到此页面的原因),那么这不会只是让您收到烦人的消息框吗? - user585968
这显示了与在VS的输出窗口中编写的完全相同的内容。设置断点不会显示有用的堆栈跟踪。相当无用... - Chris

4
您可以将此添加到绑定每个控件的内容中。
  PresentationTraceSources.TraceLevel="High" 

在调试程序时,详细的绑定信息将出现在输出窗口中。这可能会有所帮助。您还可以创建一个透过转换器来捕获错误的方法(有时可以捕获问题,但并非总是如此)。据我所知,通常没有很好的用于调试XAML的工具。


1

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

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


-1
在VisualStudio中,转到工具-扩展和更新-(下载Output Enhancer)。 当您构建解决方案时,如果存在绑定错误,您将会以红色显示您发布的精确错误消息。

Output enhancer


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