Режим редактирования формы данных и навигация от страницы.MVVM Silverlight - PullRequest
0 голосов
/ 25 июня 2011

Использование SL4 в MVVM.

Когда у меня есть форма данных в режиме редактирования и я перехожу на другую страницу, я получаю ошибки, связанные с попыткой RaisePropertyChanged (ссылка на объект не установлена ​​на экземпляр объекта).

Я нашел это и реализовал его, пытаясь решить проблему.Моя форма данных определенно попадает в мою функцию CancelEdit (часть моей реализации IEditableObject, расположенную в базовом классе для всех моих моделей).

Я также инициализировал все мои обнуляемые переменные объявлений / вспомогательных переменных с соответствующими значениями (например, закрытое десятичное _GeneralOverhead = 0,0M), поэтому я действительно озадачен тем, что не устанавливается для экземпляра объекта.Ошибка возникает после следующих шагов:

1) Откройте форму данных и нажмите кнопку «Изменить элемент»
2) Отредактируйте значение в одном из полей
3) перейдите на другую страницу

В этот момент я вызываю метод edit edit в моем EditableModelBase (реализующий IEditableObject).Отсюда это код hte:

4) Внутри EditableModelBase:

public void CancelEdit()
    {
        foreach (var info in CurrentModel.GetType().GetProperties())
        {
            if (!info.CanRead || !info.CanWrite) continue;
           // if (info.Name == "StatusCodeString" || info.Name == "StatusCodeImage" || info.Name == "StatusCodeColor") continue;
            var oldValue = info.GetValue(Cache, null);
            CurrentModel.GetType().GetProperty(info.Name).SetValue(CurrentModel, oldValue, null);
        }
    }

На первой итерации моего цикла foreach при попадании в строку .SetValue (CurrentModel) он вызываетдо моей модели.Теперь, каждый из реквизитов в моей модели RaisePropertyChanged, потому что в противном случае моя форма данных не распознает, что она была изменена (тем самым позволяя кнопке «отменить» включить себя).Когда RaisingPropertyChanged запускается, он вызывает этот блок кода:

protected virtual void RaisePropertyChanged(string propertyName)
    {
        VerifyPropertyName(propertyName);

        var handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Я попытался добавить проверки на обработчик и 'new PropertyChangedEventArgs', и они оба были созданы.Единственное, о чем я могу думать, - это то, что мой объект this настроен (в данном случае) на мою модель Models.Transactions.Даже если это правда, я не уверен, как это исправить.Есть идеи?

1 Ответ

0 голосов
/ 26 июня 2011

Из того, что я вижу из вашего поста, я предполагаю, что одного из свойств, которые вы ищете, там нет.Чтобы минимизировать риск и, возможно, решить проблему, я бы предложил следующую реализацию:

public void CancelEdit() { 
    foreach (var info in CurrentModel.GetType().GetProperties()) { 
        if (!info.CanRead || !info.CanWrite) continue; 
        // if (info.Name == "StatusCodeString" || info.Name == "StatusCodeImage" || info.Name == "StatusCodeColor") continue; 
        var oldValue = info.GetValue(Cache, null); 
        var property = CurrentModel.GetType().GetProperty(info.Name);
        if (property != null)
            property.SetValue(CurrentModel, oldValue, null); 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...