C# 检查属性是否已更改

C# 检查属性是否已更改,c#,properties,save,reset,C#,Properties,Save,Reset,我有一个带菜单栏的窗口。共有3个菜单项(命令): 新文件 加载文件 保存文件 在我的MVVM中,我有几个属性。如果用户加载文件,则将填充属性。 用户可以在程序中执行某些操作(更改属性的值…),并可以将属性的值保存到xml文件中。 因此,如果用户保存文件并单击“新建文件”,将创建一个新文件,这意味着我将“重置”所有属性。 如果用户在程序中执行了某些操作,但没有保存文件并单击“新建文件”,则会弹出一个消息框。 它应该说‘你真的想保存文件吗?’,。。。。未保存的文件将被覆盖(我想你知道我的意思….

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

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

为了澄清这一点,以下是一些场景:

  • 用户更改程序中的属性并单击“新建文件”->弹出MessageBox
  • 用户更改程序中的属性,单击“保存文件”并单击“新建文件”->属性将被重置
  • 用户单击“加载文件”并单击“新建文件”->属性将被重置
那么,我该如何检查某个属性是否已更改?我可以有一个全局布尔值“HasChanged”。 如果用户单击保存或加载,
HasChanged=false
。如果用户做了某事,
HasChanged=true
。。。
我可以把它放在属性的每个setter中,但这是一个愚蠢的解决方案…

一个简单的例子。添加虚拟(或直接在基类中实现)并创建IsDirty标志。我总是创建一个基类并在那里实现这些方法,并创建一些OnSaved()、onload()等受保护的虚拟方法。在这种情况下,您可以拥有一个基本功能,但仍然可以在继承的类中添加自定义逻辑

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

您可以在连接到视图模型内的事件后设置标志…我使用的PropertyChanged如下
RaisePropertyChanged(()=>Number)并从ObserveObject使用它,因此我无法更改方法。但您可以在视图模型内订阅事件。每当通知的任何属性发生更改时,它都将被激发…谢谢。。。简单的解决方案,根本没想到。。。