【问题标题】:WPF best way to compare edited value and original valueWPF比较编辑值和原始值的最佳方法
【发布时间】:2014-02-17 08:43:00
【问题描述】:

想象一下,我有一个绑定到从数据库检索到的值的文本框。我有一个取消按钮。如下所示:

<TextBox Text="{Binding [someViewModel].TestVar, Mode=TwoWay}"></TextBox>

现在说TestVar 的值为 10,当用户更新该值并按下取消按钮时,我将显示一个弹出窗口告诉用户 your data will be lost. Are you sure you want to proceed?

我的想法是使用TextChangedUpdateSourceTrigger="PropertyChanged" 更新布尔标志,并在取消按钮onclick 时进行检查。但问题是,如果用户先将值从 10 更新到 5,然后再更新回 10?然后当用户按下取消按钮时,应该没有警报消息。

我想知道实现目标的最有效方法是什么?

【问题讨论】:

    标签: c# wpf logic


    【解决方案1】:

    有多种方法可以实现这一目标。

    1. 对您的视图模型进行深度克隆并验证两个整数值。见How do you do a deep copy an object in .Net

    2. 用两个字段创建一个IntegerViewModel

      // the value
      public int Value { get; set; }
      // the temporary backup value on edit.
      public int BackupValue { get; set; }
      

    【讨论】:

    • 仅出于验证目的而存储一份副本会不会很繁重?
    • 如果您想在值更改后避免通知但又具有旧值,则必须知道旧值。只有保存后才能知道旧值。所以你必须以任何方式制作副本。如果只是这个值,我不会为原始类型制作视图模型或额外视图模型的副本。然后将其存储在您的视图模型中。
    【解决方案2】:

    在 MVVM 场景中,在View-model 中实现IEditableObject 接口,如本 SO Answer 中的解释和推荐

    IEditableObject 是一个很好的界面,您可以随时回滚更改。

    【讨论】:

      【解决方案3】:

      如果您只想知道更改是否已执行,而不是确切地知道哪个属性值更改为另一个等等。您可以将这些信息存储在一个简单的布尔标志中,如下所示:

      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 字段中。在验证方法中您只需比较现有对象的所有必需属性及其备份

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-10
        • 2018-04-03
        • 2019-12-21
        • 1970-01-01
        • 2020-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多