数据形式编辑模式&导航离开页面。 MVVM Silverlight

时间:2011-06-25 05:06:20

标签: silverlight mvvm

在MVVM中使用SL4。

当我在编辑模式下有一个数据表,并且我导航到另一个页面时,我收到与尝试RaisePropertyChanged相关的错误(对象引用未设置为对象的实例)。

我找到了this并实施了它,试图解决问题。我的Dataform肯定是我的CancelEdit函数(我的IEditableObject实现的一部分,位于我所有模型的基类中)。

我还用适当的值初始化了所有可空的声明/支持变量(例如private decimal _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模型。即使这是真的,我也不确定如何解决它。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

从我发布的帖子中我可以看出,你所追求的其中一个属性并不存在。为了最大限度地降低风险并解决问题,我建议采用以下方法:

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); 
    }
}