【问题标题】:How does one detect SetBinding success or failure in Silverlight?如何在 Silverlight 中检测 SetBinding 成功或失败?
【发布时间】:2010-12-14 04:23:56
【问题描述】:

来自 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”属性...

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

【问题讨论】:

  • +1 很好的问题。可悲的是,我认为这可能是微软说“哦,我没想到”的情况

标签: silverlight data-binding silverlight-3.0 binding


【解决方案1】:

您可能想查看this。它特定于 WPF,但也应该主要与 Silverlight 相关,并且可能会为您提供一些关于如何解决这些问题的想法。

【讨论】:

  • Article 在以编程方式检测绑定失败方面并没有真正的帮助。
  • @Anthony:这需要想象力。记录问题/引发异常的跟踪侦听器将执行此操作。
  • 问题是,Silverlight 中没有 TraceListener 的等价物 :-(
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这是一个非常艰难的。我不得不考虑一下,但我不认为你会喜欢这个答案(不,不是 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 只有在找到属性路径时才会被调用。

    【讨论】:

    • Anthony,这是一个非常有创意的解决方案。通过改变我在自定义复合控件上实现“自动绑定”的整个方法,我可能会走一条不同的路线。我真的很感激你的努力。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    相关资源
    最近更新 更多