Ala*_*ain 19 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'都绑定到可能有或没有那种类型的东西(再次 - 没有简单的方法可以告诉).
sll*_*sll 25
如果您不知道哪个绑定失败
我会将Snoop实用程序用于此目的.简而言之 - 在可视化树上方的左上角,您将找到一个允许过滤视觉效果的下拉列表,只需选择带有绑定错误的视觉效果.有关详细信息,请参阅在线文档
如果您知道哪个绑定失败
有时你知道哪个绑定失败但是找不到问题的来源,因为绑定非常棘手,例如TemplateBindings,引用另一个控件的DataContext的绑定等等.我发现有用的是把一个TextBlockText属性绑定通过这种方式,您可以看到完全绑定的内容,因为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}" />
Run Code Online (Sandbox Code Playgroud)
有用的链接:
Gay*_*Fow 11
自从2009年首次发布以来,我一直在愉快地使用"启动代码"中的精彩片段来检测和报告绑定错误...
http://www.switchonthecode.com/tutorials/wpf-snippet-detecting-binding-errors
编辑:仍然在VS2012上工作得很好(2013年9月)
该链接显示已损坏,因此我将粘贴到相关的代码段中...
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
并设置/初始化它......
namespace WpfListeningForTraceErrors
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
BindingErrorTraceListener.SetTrace();
InitializeComponent();
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13970 次 |
| 最近记录: |