0

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

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

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

因此,为了清除它,这里有一些场景:

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

那么我应该如何检查属性是否已更改?我可以有一个全局布尔值“HasChanged”。如果用户单击保存或加载,HasChanged = false. 如果用户做了某事,HasChanged = true......我可以把它放在属性的每个设置器中,但这是一个愚蠢的解决方案......

4

1 回答 1

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;
  }
于 2013-06-18T06:55:14.523 回答