0

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

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

4

2 回答 2

2

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

  <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();

将组值绑定到模型。

于 2013-07-19T10:47:13.560 回答
1

有多种方法:

  1. 您提到的其中一个 - 只需丢弃修改过的对象并从存储中获取具有未更改属性的新对象。
  2. 纪念品/看守者模式。Memento 是一个对象,它获取原始值的快照,而 Caretaker 是一个对象,它可以使用存储在 Memento 中的快照回滚更改(此外,您可以将 Undo/Redo 视为此模式的演变)。
  3. 您可以修改对象的副本,如果用户想要保存更改,您应该将属性值从副本应用到原始。这需要对象到对象的映射器(例如 Automapper),因为手动复制属性值很容易出错。
于 2013-07-19T10:45:03.607 回答