【发布时间】: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 方法跳转到异常。
【问题讨论】:
-
坚果,刚刚发现mvvmlight.codeplex.com/workitem/7520。果然是我的问题。
标签: mvvm-light