2013-07-19 66 views
0

我在我的程序中定製了屬性網格,其中所有屬性都可以從viewModel進行綁定。在這個屬性網格中還有2個按鈕 - SaveBtn和EditBtn。 用戶編輯屬性網格中的屬性。當單擊SaveBtn時,所有屬性必須保存在數據庫中。如果用戶想要編輯屬性,他點擊EditBtn,然後在將屬性保存到數據庫(單擊SaveBtn)之前,應該出現一個新窗口,其中用戶選擇修改屬性的原因。在該窗口中還有三個按鈕 - ExitWithSavingToDatabase,ExitWithoutSavingToDatabase和Cancel。點擊取消取消取消更改

如果用戶選擇取消,則應取消所有更改。但viewModel中的屬性已經有了新的值。 我的問題是 - 我如何重置屬性到舊的值?我正在考慮從數據庫重新加載屬性,但是如果有更好的解決方案,我可以在不使用數據庫的情況下做到這一點?

+0

你正在逆向工作,如果你點擊確定(或類似),你應該將屬性設置爲新值。 – Sayse

+0

你可以使用jscript存儲你的表單,並且只能從jscript中單擊btncancel進行恢復。 – Veer

+0

@Sayse用戶應該能夠編輯屬性網格中的屬性。所以當用戶點擊editBtn時,他可以編輯屬性,或者我應該創建一些彈出窗體來編輯值? – Sasha

回答

1

有辦法號碼:

  1. 其中你提到的 - 只是扔掉修改的對象,並得到新的從商店不變性質。
  2. Memento/Caretaker pattern。 Memento是一個對象,它接受原始值的快照,而Caretaker是一個對象,可以使用存儲在Memento中的快照回滾更改(另外,您可以將撤消/重做視爲此模式的演變)。
  3. 您可以修改對象的副本,並且如果用戶想保存更改,則應該將副本的屬性值應用到原始副本。這需要對象到對象的映射器(例如Automapper),因爲屬性值的手動複製很容易出錯。
1

可能更好的方法是隻使用綁定組中的值,而不是模型。 這支持綁定事務提交/中止 定義結合基團爲你的窗口

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

YourValidationClass應該處理BindingGroup的驗證,而不是一個單一的值。重要的始終使用的GetValue從的BindingGroup這裏,而不是從模式,這個模式還沒有被修改

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

將組值綁定到模型。