在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模型。即使这是真的,我也不确定如何解决它。 有什么想法吗?
答案 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);
}
}