如何在Silverlight中检测挫折的成功或失败?

如何在Silverlight中检测挫折的成功或失败?,silverlight,data-binding,silverlight-3.0,binding,Silverlight,Data Binding,Silverlight 3.0,Binding,来自C#的简单绑定: 我想知道这次挫折是否成功。SetBinding显然知道何时出现问题,因为它在应用程序运行时显示在输出窗口跟踪中: System.Windows.Data错误:BindingExpression路径错误:“Tc.Views.TestAccount”上未找到“Interestate”属性 无论SetBinding()成功还是失败,BindingExpressionBase在我看来都是一样的,并且没有引发异常。我也尝试了绑定通知标志的不同值。您可能想签出。它是特定于WPF的,但也

来自C#的简单绑定:

我想知道这次挫折是否成功。SetBinding显然知道何时出现问题,因为它在应用程序运行时显示在输出窗口跟踪中:

System.Windows.Data错误:BindingExpression路径错误:“Tc.Views.TestAccount”上未找到“Interestate”属性


无论SetBinding()成功还是失败,BindingExpressionBase在我看来都是一样的,并且没有引发异常。我也尝试了绑定通知标志的不同值。

您可能想签出。它是特定于WPF的,但也应该主要与Silverlight相关,并且可能会给您一些关于如何解决这些问题的想法。

这是一个非常棘手的问题。我不得不考虑一下,但我不知道你会喜欢这个答案(不,不是42)

严格的回答是不,没有。然而,有一个可怕的一次性解决方案,坦白地说,我不推荐,但如果它是绝对不可避免的可能是有用的。首先,您需要一个值转换器:-

public class ConvertibleValueConverter : IValueConverter
{
  public bool Converted { get; private set; }

  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    Converted = true;

    return ((IConvertible)value).ToType(targetType, culture);
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    return ((IConvertible)value).ToType(targetType, culture); ;
  }
}
现在,您可以按如下方式修改源代码:-

Binding binding = new Binding(SourceName);
binding.Mode = BindingMode.TwoWay;
binding.Converter = new ConvertibleValueConverter();
BindingExpressionBase beb = SetBinding(SourceDependencyProperty, binding);
if (!((ConvertibleValueConverter)binding.Converter).Converted)
{
  // Path SourceName was not found.
}

此代码假定已存在适当的DataContext。转换器仅处理实现IConvertible的基本系统类型(String、Int、Double、DateTime等)之间的典型转换。因为只有找到属性路径时才会调用
Convert

我建议您使用Karl Shiflett的。GlimpseService公开了一个API,允许您手动处理任何绑定异常


基本技术相当简单-请听Application.UnhandledException和Application.RootVisual.BindingValidationError,您应该能够拦截绑定错误

这篇文章对以编程方式检测绑定失败并没有真正的帮助。@Anthony:这需要想象力。记录问题/引发异常的跟踪侦听器将执行此操作。问题是,Silverlight中没有与TraceListener等效的跟踪侦听器:-(+1个非常好的问题。遗憾的是,我认为这可能是Microsoft说“哦,我没想到这一点”的情况Anthony,这是解决这个问题的一个非常有创意的解决方案。我可能会改变我在自定义复合控件上实现“自动绑定”的整个方法。我非常感谢您的努力。谢谢
Binding binding = new Binding(SourceName);
binding.Mode = BindingMode.TwoWay;
binding.Converter = new ConvertibleValueConverter();
BindingExpressionBase beb = SetBinding(SourceDependencyProperty, binding);
if (!((ConvertibleValueConverter)binding.Converter).Converted)
{
  // Path SourceName was not found.
}