【问题标题】:MvvmLight RaisePropertyChanged error in Release builds?发布版本中的 MvvmLight RaisePropertyChanged 错误?
【发布时间】:2011-07-21 02:56:43
【问题描述】:

我在 MvvmLight v4(.NET 4 版本,v4.0.0.0/BL0016,通过 NuGet 安装)下出现了一个奇怪的小错误。在我的项目中是一个视图模型(它继承自 ViewModelBase),它表示在画布上绘制的视觉元素。此视图模型具有典型的 Top/Left/Width/Height 属性,每个属性都调用 RaisePropertyChanged,例如

public double Width
{
    get { return _width; }
    set
    {
        if (Math.Abs(_width - value) < DeltaEpsilon)
        {
            return;
        }

        _width = value;
        RaisePropertyChanged();
    }
}

针对各种事件,视图模型也有计算可视元素的位置和尺寸,并适当设置属性的方法:

public void CalculateSize()
{
    Width = DoSomeCalculation();
    // Calculate other settings...
}

我有一些单元测试来验证计算是否正确完成,当我在调试模式下运行时,测试运行良好。但是,如果我在 Release 模式下运行,测试会失败,但有以下异常:

SetUp : System.InvalidOperationException : This method can only by invoked within a property setter.
at GalaSoft.MvvmLight.ObservableObject.RaisePropertyChanged()
at MyProject.ViewModels.TableViewModel.CalculateSize() in TableViewModel.cs: line 154

TableViewModel 上的第 154 行是 Width = DoSomeCalculation() 行。换句话说,当我的方法尝试设置属性的值时,MvvmLight 抱怨我没有从属性设置器中调用 RaisePropertyChanged。我已经尝试调试测试(使用 Reshaper 的测试调试器),但是当我运行调试器时,测试通过了(可能在 Resharper 中调试单元测试会强制它进入调试模式,即使已经处于发布模式?)错误也会发生在应用程序本身中。

关于为什么发布模式会破坏代码的任何想法?编译器优化代码的方式是否会破坏 ObservableObject 的 RaisePropertyChanged() 方法中 StackTrace 的使用?请注意,上面的异常没有显示正在输入的 Width 设置器,它直接从 CalculateSize 方法跳转到异常。

【问题讨论】:

标签: mvvm-light


【解决方案1】:

如果您查看 MVVM Light 代码,您可以看到 RaisePropertyChanged() 使用 StackTrace 来确定属性的名称。如this post 所述,这可能是发布模式中的问题。

使用不同的 RaisePropertyMethod 来解决这个问题 - 您可以使用以下方法之一:

RaisePropertyChanged<YourClass>(x => x.Width);

RaisePropertyChanged("Width");

两种方法都使用不同的方法来确定已更改的属性的名称(第二种仅使用属性名称)。

【讨论】:

  • 虽然我已经发布了一个链接显示我的问题的原因,但我会给你答案,因为你提供了一个解决方法:-)
  • 链接只是说有问题。在我的帖子中,我引用了另一个 Stackoverflow 帖子,该帖子实际上解释了 为什么 它不起作用的原因。我还向 Laurent 指出了这个问题,请参阅 twitter.com/LBugnion/status/94173507906318337 以获得他的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 2014-02-11
相关资源
最近更新 更多