数据表单编辑模式&离开页面 MVVM Silverlight

问题描述

| 在MVVM中使用SL4。 当我处于编辑模式下的数据表单时,导航到另一个页面,我遇到与RaisePropertyChanged(对象引用未设置为对象实例)相关的错误。 我发现并实施了它,以解决此问题。我的Dataform肯定命中了我的CancelEdit函数(我的IEditableObject实现的一部分,位于所有模型的基类中)。 我还用适当的值(例如,私有小数_Generaloverhead = 0.0M)初始化了所有可为空的声明/支持变量,因此,对于未设置为对象实例的内容,我确实感到困惑。在执行以下步骤后,将发生错误: 1)拔出数据表格并点击“编辑项目”按钮 2)在其中一个字段中编辑一个值 3)导航到另一个页面 此时,我在我的EditableModelBase中调用cancel edit(实现IEditableObject)。从这里开始,这是代码: 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模型的事实。即使那是真的,我也不知道如何解决它。 有任何想法吗?     

解决方法

        根据我从您的帖子中看到的内容,我会假设您所需要的属性之一不存在。为了将风险降到最低并可能解决问题,我建议采用以下实现:
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); 
    }
}