2009-11-07 74 views
4

简单的从C#绑定:如何在Silverlight中检测SetBinding成功或失败?

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

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

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

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

+0

+1优秀的问题。可悲的是,我认为这可能是微软说的话“哦,我没有想到” – AnthonyWJones 2009-11-07 17:03:31

回答

2

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

基本技巧非常简单 - 监听Application.UnhandledException和Application.RootVisual.BindingValidationError,并且您应该能够拦截绑定错误。

0

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

+0

文章没有真正帮助以编程方式检测绑定失败。 – AnthonyWJones 2009-11-07 16:11:05

+0

@Anthony:只需要想象力。记录问题/引发异常的跟踪监听器将执行此操作。 – 2009-11-07 20:32:35

+0

问题是,在Silverlight中没有相同的TraceListener :-( – 2010-04-29 01:33:59

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只有在找到属性路径时才会被调用。

+0

Anthony,这是一个非常有创意的解决方案,我可能会通过改变我在整个自定义组合控件上实现“AutoBinding”的整个方法来走另一条路线。我非常感谢这项努力,谢谢 – 2009-11-07 22:12:31

相关问题