【问题标题】:WPF Binding default modeWPF 绑定默认模式
【发布时间】:2011-01-21 14:07:15
【问题描述】:

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

<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”的帮助。不同机器上的默认绑定模式怎么可能不同?

【问题讨论】:

  • 这听起来像是框架的版本问题。我不确定默认绑定模式何时更改,但它可能位于其中一个服务包(或修补程序)中。这些年来似乎发生了一些奇怪的变化,而且很难跟踪。你的目标是什么版本?
  • Net Framework 4.0,与 Visual Studio 2010 一起安装。我不能确定,但​​这可能是新的东西,因为我的客户两天前安装了 VS Pro 试用版。也许是 Sp1..

标签: wpf binding


【解决方案1】:

ProgressBar 中的Value 属性默认绑定TwoWay,因此除非您将Mode 显式设置为OneWay,否则应该会发生异常。但是我无法解释为什么它不会出现在您的机器上。我尝试将 Reflector 与 .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));

【讨论】:

  • 感谢您的回答。首先,我了解到可以在 DP 元数据中设置默认绑定模式——我以后肯定会更加小心。我已经在我的框架上检查了上面的代码,它还包含 BindsTwoWayByDefault。这很奇怪..
猜你喜欢
  • 2011-07-21
  • 2010-11-08
  • 2011-01-15
  • 2011-07-22
  • 2018-11-25
  • 2011-01-17
  • 1970-01-01
  • 2020-02-05
  • 2018-12-16
相关资源
最近更新 更多