MvvmLight RaisePropertyChanged ошибка в сборках выпуска? - PullRequest
3 голосов
/ 21 июля 2011

У меня странная маленькая ошибка, возникающая в 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

, где строка 154 в TableViewModel - это строка Width = DoSomeCalculation ().Другими словами, когда мой метод пытается установить значение свойства, MvvmLight жалуется, что я не вызываю RaisePropertyChanged из установщика свойства.Я пытался отладить тест (используя отладчик теста Reshaper), но когда я запускаю отладчик, тест проходит (может быть, отладка модульного теста в Resharper переводит его в режим отладки, даже если он уже находится в режиме Release?).в самом приложении.

Есть идеи, почему режим Release нарушает код?Есть ли что-то в том, как компилятор оптимизирует код, который нарушает использование StackTrace в методе RaisePropertyChanged () ObservableObject?Обратите внимание, что в приведенном выше исключении не отображается вводимый параметр Width, он переходит прямо из метода CalculateSize к исключению.

1 Ответ

3 голосов
/ 22 июля 2011

Если вы посмотрите на код MVVM Light, вы увидите, что RaisePropertyChanged() использует StackTrace для определения имени свойства.Это может быть проблемой в режиме выпуска, как описано в этом сообщении .

Используйте другой метод RaisePropertyMethod, чтобы обойти эту проблему - вы можете использовать один из следующих методов:

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

или

RaisePropertyChanged("Width");

Оба метода используют разные методы для определения имени измененного свойства (второй просто использует имя свойства).

...