WPF绑定默认模式

7
在我的一个应用程序中,我有这样的一段代码:

<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'.

通常我会认为这是某种骗局,但我知道这个人对编码一无所知,“Mode=OneWay”显式设置有帮助。默认绑定模式如何在不同的机器上不同呢?

这听起来像是框架版本问题。我不确定默认绑定模式何时更改,但它可能在其中一个服务包(或热修复程序)中进行了更改。多年来似乎发生了一些奇怪的变化,很难跟踪。您的目标版本是什么? - Abe Heidebrecht
Net Framework 4.0是与Visual Studio 2010一起安装的。我不能确定,但这可能是新的东西,因为我的客户大约两天前安装了VS Pro试用版。也许它是带有Sp1的。 - kubal5003
1个回答

4
ProgressBar中的Value属性默认绑定为TwoWay,因此除非您显式将Mode设置为OneWay,否则应该会出现异常。但是我不能解释为什么在您的机器上没有出现异常。我尝试使用.NET版本4.0、3.5和3.0的反编译工具Reflector,并且据我所知,默认绑定模式已经有一段时间没有改变了。

如果您安装了Reflector,看看您的机器上继承自RangeBaseValueProperty是什么样子可能会很有趣。

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));

谢谢您的回答。首先,我学到了默认绑定模式可以在 DP 元数据中设置 - 将来我一定会更加小心。我在我的框架上检查了上面的代码,它也包括 BindsTwoWayByDefault。这很奇怪... - kubal5003

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接