2011-01-21 107 views
7

在我的应用程序之一,我有这样的代码:WPF绑定默认模式

<ProgressBar Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" Height="27" Margin="5,0,5,0" Maximum="{Binding TabuProgressEnd}" Value="{Binding TabuProgress}" /> 

虽然我是测试这一切都很好,但我的客户开了这家VS下时并运行该代码抛出一个异常:

An unhandled exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll 

Additional information: A TwoWay or OneWayToSource binding cannot work on the read-only property 'TabuProgress' of type 'TSPLib.TabuEngine'. 

通常我会觉得这是某种形式的骗局,但我知道这家伙没有关于编码并使得“模式=单向”明确帮助的想法。在不同的机器上,默认绑定模式有什么不同?

+0

这听起来像一个版本问题与框架上是有趣。我不确定默认绑定模式何时更改,但它可能位于其中一个Service Pack(或一个修补程序)中。这些年来似乎有一些奇怪的变化,他们很难追踪。您定位的是哪个版本? – 2011-01-21 17:33:54

+0

Net Framework 4.0,随Visual Studio 2010一起安装。我不能确定,但​​这可能是新的,因为我的客户端像两天前安装了VS Pro试用版。也许它是与Sp1 .. – kubal5003 2011-01-21 20:07:53

回答

4

Value财产ProgressBar默认绑定TwoWay所以除非你明确地设置ModeOneWay应该发生异常。但是我无法解释为什么它不会在您的机器上出现。我尝试使用.NET版本4.0,3.5和3.0的Reflector,据我所知,默认绑定模式在一段时间内没有改变。

如果您已经安装反射器,它会看什么ValueProperty(从RangeBase继承)看起来像你的机器

public static readonly DependencyProperty ValueProperty = 
    DependencyProperty.Register(
     "Value", 
     typeof(double), 
     typeof(RangeBase), 
     new FrameworkPropertyMetadata(
      0.0, 
      FrameworkPropertyMetadataOptions.Journal | 
      FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
      new PropertyChangedCallback(RangeBase.OnValueChanged), 
      new CoerceValueCallback(RangeBase.ConstrainToRange)), 
     new ValidateValueCallback(RangeBase.IsValidDoubleValue));