检查属性是否已更改

时间:2013-06-18 06:41:00

标签: c# properties save reset

我有一个带菜单栏的窗口。共有3个菜单项(命令):

  • 新文件
  • 加载文件
  • 保存文件

在我的MVVM中,我有几个属性。如果用户加载文件,则将填充该属性。 用户可以在程序中执行某些操作(更改属性的值..),并可以将属性的值保存到xml文件中。 因此,如果用户保存文件并单击“新文件”,将创建一个新文件,这意味着我将“重置”所有属性。 如果用户在程序中执行某些操作并且未保存文件并单击“新建文件”,则会弹出MessageBox。 它应该说'你真的想要保存文件,......未保存的文件将被覆盖'(猜猜你知道我的意思..)

所以要清除它,这里有一些场景:

  • 用户更改程序中的属性并点击“新文件” - > MessageBox弹出
  • 用户更改程序中的属性并点击“保存文件”并点击“新文件” - > Propertys将被重置
  • 用户点击“加载文件”并点击“新文件” - > Propertys将被重置

那我该怎么检查房产是否有变化?我可以有一个全局布尔值'HasChanged'。 如果用户点击了保存或加载,HasChanged = false。如果用户执行了某些操作,HasChanged = true ... 我可以把它放在每个属性的设置器中,但这是一个愚蠢的解决方案......

1 个答案:

答案 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;
  }