我有一个带菜单栏的窗口。共有3个菜单项(命令):
在我的MVVM中,我有几个属性。如果用户加载文件,则将填充该属性。 用户可以在程序中执行某些操作(更改属性的值..),并可以将属性的值保存到xml文件中。 因此,如果用户保存文件并单击“新文件”,将创建一个新文件,这意味着我将“重置”所有属性。 如果用户在程序中执行某些操作并且未保存文件并单击“新建文件”,则会弹出MessageBox。 它应该说'你真的想要保存文件,......未保存的文件将被覆盖'(猜猜你知道我的意思..)
所以要清除它,这里有一些场景:
那我该怎么检查房产是否有变化?我可以有一个全局布尔值'HasChanged'。
如果用户点击了保存或加载,HasChanged = false
。如果用户执行了某些操作,HasChanged = true
...
我可以把它放在每个属性的设置器中,但这是一个愚蠢的解决方案......
答案 0 :(得分:1)
一个简单的例子。直接在基类中添加虚拟(或实现)并创建IsDirty标志。我总是创建一个基类并在那里实现那些方法并创建一些OnSaved(),OnLoaded()等受保护的虚拟方法。在这种情况下,您可以拥有基本功能,但仍然可以在继承的类中添加自定义逻辑。
public bool IsDirty { get; private set; }
protected void RaisePropertyChanged(string propertyName)
{
var handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
this.OnPropertyChanged(propertyName);
}
}
protected void OnPropertyChanged(string propertyName)
{
IsDirty = true;
}
public void Save()
{
IsDirty = false;
}