单击CancelBtn取消更改

时间:2013-07-19 10:36:34

标签: c# wpf mvvm

我的程序自定义属性网格中,所有属性都可以从viewModel绑定。在这个属性网格中还有2个按钮--SaveBtn和EditBtn。 用户编辑属性网格中的属性。单击SaveBtn时,所有属性都必须保存在数据库中。如果用户想要编辑属性,则单击EditBtn,然后在将属性保存到数据库(单击SaveBtn)之前,应该出现新窗口,其中用户选择修改属性的原因。在该窗口上还有三个按钮 - ExitWithSavingToDatabase,ExitWithoutSavingToDatabase和Cancel。

如果用户选择取消,则应取消所有更改。但是viewModel中的属性已经有了新值。 我的问题是 - 如何将属性重置为旧值? 我正在考虑从数据库重新加载属性,但如果有更好的解决方案,我可以在不使用数据库的情况下完成它?

2 个答案:

答案 0 :(得分:1)

有很多方法:

  1. 你提到的其中一个 - 只是丢弃修改后的对象,并从商店获取一个未更改属性的新对象。
  2. Memento/Caretaker pattern。 Memento是一个对象,它获取原始值的快照,而Caretaker是一个对象,可以使用存储在Memento中的快照回滚更改(另外,您可以将Undo / Redo视为此模式的演变)。
  3. 您可以修改对象的副本,如果用户想要保存更改,则应将属性值从副本应用于原始值。这需要对象到对象的映射器(例如Automapper),因为手动复制属性值很容易出错。

答案 1 :(得分:1)

可能更好的方法是仅使用绑定组中的值,而不是模型。 这支持绑定事务提交/中止 为您的窗口定义绑定组

  <Window.BindingGroup>
    <BindingGroup >
      <BindingGroup.ValidationRules>
        <local:YourValidationClass/>
      </BindingGroup.ValidationRules>
    </BindingGroup>
  </Window.BindingGroup>

YourValidationClass应该处理BindingGroup的验证,而不是单个值。重要的是始终使用BindingGroup中的GetValue,而不是模型,模型尚未修改

public class YourValidationClass : ValidationRule
  {
      public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
      {
          BindingGroup bindingGroup = (BindingGroup)value;

          if (bindingGroup.Items.Count == 1)
          {
              User user = (User)bindingGroup.Items[0];
              string firstName = (string)bindingGroup.GetValue(user, "FirstName");
              string lastName = (string)bindingGroup.GetValue(user, "LastName");

              if (string.IsNullOrWhiteSpace(firstName) || string.IsNullOrWhiteSpace(lastName))
              {
                  return new ValidationResult(false, "Both fields required");
              }
          }
          return ValidationResult.ValidResult;
      }
  }

然后,您的取消按钮应执行以下代码:

this.BindingGroup.CancelEdit();

您的保存按钮至少应该

this.BindingGroup.CommitEdit();

将组值绑定到模型。