簡體   English   中英

在WPF MVVM中驗證和保存數據如何正常工作?

[英]How does validating and saving data in WPF MVVM work right?

我是MVVM(和WPF的新手)的新手,最近幾天我閱讀了許多Code Project文章,博客文章和Stackoverflow問題。 我的印象是,數據綁定非常好用,可以顯示從數據源(數據庫)加載的數據,並使模型與視圖保持同步,還可以更新視圖中模型數據的所有其他外觀。

但是我仍然沒有真正的頭緒,在進行驗證之前,應該如何進行保存。 我有很強的Windows Forms和ADO.NET背景。 我對編碼數據庫訪問層和視圖更新都很熟悉。 那時,只有在視圖中才有臨時的臨時數據被編輯,並且模型類和數據庫中有數據的最后保存版本。 模型類通常與數據庫同步。 該視圖包含尚未保存的數據。

您還具有一個“保存”按鈕,該按鈕將從控件中讀取所有數據,在代碼中對其進行驗證,然后接受並將其保存到模型和數據庫中,或者不更新模型而顯示一條錯誤消息。 如果發生錯誤,則用戶輸入保留在UI中供用戶更正。 但是應用程序的其他部分看不到它。 而且您有一個“取消”按鈕,該按鈕只會丟棄視圖中包含編輯控件的那部分-模型仍然有效且不變。

現在,有了數據綁定和ViewModels才公開了Model類中的數據,無論是否正確,在TextBox中輸入的內容都會立即進入模型。 IDataErrorInfo只不過是提供信息。 您可以考慮或忽略它。 唯一強制執行的硬驗證是類型轉換:您永遠不能將非數字字符串更新為數字模型字段。 就是這樣。 我將通過讓ViewModel進行所有驗證並在無效數據上引發來自屬性設置器的異常來解決這一問題。 這是實現已知行為的唯一方法。

但是數據的保存和丟棄在哪里? 我何時真正將數據寫回到數據庫? 是否每次離開TextBox都會導致數據庫寫入,這樣我就不再需要顯式的Save命令(只需通過Undo恢復即可)? 什么時候驗證整個數據記錄? 由於數據綁定,我將如何處理模型和數據庫不同步,無效輸入立即在整個應用程序和所有視圖中傳播的問題? 我何時以及如何使用“取消”按鈕放棄任何用戶輸入,使模型保持不變-或將其恢復為打開該編輯器對話框之前的狀態?

我覺得MVVM不能為這些基本問題提供解決方案。 我只是想念他們還是真的不存在? 如果MVVM不能解決這個問題,那是什么? 還是最好不要將MVVM用於WPF中的數據編輯應用程序?

MVVM不能為您解決這些問題-您可以靈活(以能力或負擔為重)以您選擇的任何方式解決數據庫編寫問題。 如果需要在保存回數據庫之前收集所有數據,則可以執行此操作-只需在ViewModel上添加綁定到SaveCommand的Save按鈕,該按鈕即可執行數據訪問存儲過程/實體框架更新方法/任何操作。 如果要單獨記錄數據的每個位,則需要在其他地方調用數據訪問過程(可能是視圖模型上的屬性設置器?)

本質上,MVVM並不是完整的端到端軟件模式。 它只是在查看用戶看到的內容(列表框,文本框和按鈕)與應用程序本身之間的通信。 無論您使用什么(無論使用什么),您的數據訪問代碼,序列化,存儲,持久性都保留在應用程序代碼(模型)中,位於應用程序的MVVM端。 您可以根據自己的喜好編寫此代碼。

我目前正在編寫一個應用程序,其中用戶填寫表單並單擊“保存”或“取消”。 保存和取消都是綁定到ViewModel上命令的按鈕。 在ViewModel構造函數中,將模型對象的屬性復制到ViewModel的屬性。 在保存時,將ViewModel的屬性復制回模型的屬性,並啟動數據訪問代碼。 取消時,將模型的屬性復制回ViewModel的屬性。

class MyViewModel
{
   public MyViewModel(MyModel model)
   {
      this.Name = model.Name;
      this.Colour = model.Colour;
   }

   public string Name {get;set;}
   public string Colour {get;set;}

   // commands here that connect to the following methods

   public void Save()
   {
      model.Name = this.Name;
      model.Colour = this.Colour;
      model.SaveToDatabase();
   }

   public void Cancel()
   {
      this.Name = model.Name;
      this.Colour = model.Colour;
   }

}

這是執行此操作的簡單方法-當然,您需要將INotifyPropertyChanged及其它其余部分放入其中,還有其他選擇。 但是我發現此方法易於理解正在發生的事情,並且是添加您可能需要添加的其他任何內容的良好基礎。

使用MVVM,您可以將視圖中的控件綁定到ViewModel中的屬性和命令。 模型代表您的數據庫。

用戶輸入的驗證可以通過多種方式完成。 您可以將文本框限制為僅接受某些數據,可以在屬性設置器等中驗證數據。

我不是數據庫專家,但我會在VM中收集信息,並在視圖中的某處添加一個保存按鈕,以驗證數據並將其寫入數據庫。 取消按鈕可能會使用模型(數據庫)中的(未更改)值覆蓋VM屬性。

(編輯:皮特說的:)

我認為您正在將ViewModel與數據庫混淆,您的視圖已綁定到ViewModel中的對象,當離開TextBox時,TextBox中的任何內容都將分配給仍在內存中的ViewModel對象。 您將需要一個保存按鈕,MVVM只是將傳統視圖和代碼分開的一種模式,以進行去耦和簡便的單元測試。 單擊保存按鈕后,您仍然需要執行數據驗證。 為了丟棄用戶輸入並恢復到先前的狀態,您可以在編輯之前保存ViewModel數據,或者使用Entity Framework來跟蹤和管理數據更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM