想象一下,我有一个绑定到从数据库中检索的值的文本框。我有一个取消按钮。如下所示:
<TextBox Text="{Binding [someViewModel].TestVar, Mode=TwoWay}"></TextBox>
现在说TestVar
的值为10,当用户更新值并按下取消按钮时,我会显示一个弹出窗口,告诉用户your data will be lost. Are you sure you want to proceed?
我的想法是使用TextChanged
或UpdateSourceTrigger="PropertyChanged"
来更新布尔标志,并在取消按钮onclick
时进行检查。但问题是,如果用户首先将值从10更新为5,然后再更新为10?然后当用户按下取消按钮时,应该没有警告信息。
我可以知道实现目标的最有效方法是什么?
答案 0 :(得分:1)
有多种方法可以实现这一目标。
深入克隆您的viewmodel并验证两个整数值。请参阅How do you do a deep copy an object in .Net
制作一个包含两个字段的IntegerViewModel
// the value
public int Value { get; set; }
// the temporary backup value on edit.
public int BackupValue { get; set; }
答案 1 :(得分:0)
如果您只想知道更改已执行,而不是确切地将哪个属性值更改为另一个等等。您可以在这样的简单布尔标志中表示此信息:
private bool hasUnsavedChanges;
private string somePropertyValue;
public string SomeProperty
{
get
{
return this.somePropertyValue;
}
set
{
if(this.somePropertyValue!= value)
{
this.hasUnsavedChanges = true;
}
this.somePropertyValue= value
}
}
如果您需要了解有关更改的所有内容,请创建您的传输对象的复制构造函数,并将其存储在某个backupCopy字段中。在验证方法中您只需比较现有对象的所有必需属性及其备份
答案 2 :(得分:0)
在MVVM场景中,在View-model
中实现IEditableObject
接口,如此解释并在此推荐Answer
IEditableObject
是您希望能够回滚更改的好界面。