如何在Silverlight中检测SetBinding成功或失败?

时间:2009-11-07 15:19:18

标签: silverlight data-binding silverlight-3.0 binding

C#的简单绑定:

  Binding binding = new Binding(SourceName);
  binding.Mode = BindingMode.TwoWay;
  BindingExpressionBase beb = SetBinding(SourceDependencyProperty, binding);

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

System.Windows.Data错误:BindingExpression路径错误:'Tc.Views.TestAccount'上找不到'InterestRate'属性...

BindingExpressionBase看起来与我相同,SetBinding()是成功还是失败,并且没有抛出异常。我也为绑定通知标志尝试了不同的值。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

非常艰难的一个。我不得不考虑它,但我不喜欢你的答案(不是它不是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。 Converter仅处理实现IConvertible(String,Int,Double,DateTime等)的基本系统类型之间的典型转换。它起作用,因为Convert只有在找到属性路径时才会被调用。

答案 2 :(得分:0)

您可能想要检查this。它特定于WPF,但也应该与Silverlight最相关,并且可能会给你一些关于如何捕获这些问题的想法。