在這樣一個簡單的例子中,這個答案是肯定的(這是不合理的冗餘)。但是,據推測,一個頁面將包含的不僅僅是一個單一的模型對象。您可能擁有頁面狀態以及必須全部跟蹤的多個其他模型對象。這是在ViewModel中完成的。
例如,您可能有關於狀態欄中顯示的已登錄用戶的附加信息,以及運行檢測文本文件更改的服務。
您可能還有一個用於編輯Student對象的窗體。如果您打算驗證這些更改,那麼在修改完成之前,您不希望直接編輯Student對象。在這種情況下,ViewModel可以充當臨時存儲位置。
關於上述內容的注意事項:在模型中進行驗證並不少見,但即使如此,您仍然希望用戶能夠在編輯表單的過程中輸入無效值。例如,如果您的模型在字段中不允許零長度值,您仍然希望使用戶能夠刪除該值,移動到另一個字段(例如,複製它),然後返回到字段並完成編輯(粘貼)。如果你直接綁定到模型,那麼你的驗證邏輯可能不會處理這個「中間」,「尚未完成」的狀態,只要你願意。例如,您可能不想在驗證錯誤完成後點擊「保存」來提醒用戶。
您也可能在ViewModel中有Command對象來處理按鈕點擊等。這些將是模型中無用的域特定對象。
當您需要過濾或以某種方式暫時「修改」模型對象以獲得屏幕上的某些內容時,ViewModels也很有用。例如,您可能想要顯示系統中所有用戶的列表以及其中前十名執行者的實時列表(每10秒更新一次)。或者您可能想要顯示報告列表和顯示整體使用率的圖表等。在ViewModel中將過濾,排序和自定義數據。
該模型,另一方面,通常是儘可能純。理想情況下,您只需要POCOs(通常)模擬永久存儲(數據庫或您有什麼)中的內容。如果您的持久存儲具有FirstName和LastName字段,那麼您的Model也是如此。只有在你的ViewModel中,你可以將它們組合起來以得到一個Name字段(根據視圖的需要,可以是「First Last」或「Last,First」)。
例如:在MVVM
namespace Model
{
public class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Class
{
public string Name { get; set; }
public float Score { get; set; }
}
}
namespace ViewModel
{
public class EditStudentRecordViewModel
{
private Model.Student _student;
private IEnumerable<Model.Class> _studentClasses;
/* Bind your View to these fields: */
public string FullName
{
return _student.LastName + ", " + _student.FirstName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public IEnumerable<Model.Class> PassingClasses
{
get
{
return _studentClasses.Where(c => c.Score >= 78);
}
}
public IEnumerable<Model.Class> FailingClasses
{
get
{
return _studentClasses.Where(c => c.Score < 78);
}
}
public void Save()
{
List<string> l_validationErrors = new List<string>();
if (string.IsNullOrEmpty(this.FirstName))
l_validationErrors.Add("First Name must not be empty.");
if (string.IsNullOrEmpty(this.LastName))
l_validationErrors.Add("Last Name must not be empty.");
if (l_validationErrors.Any())
return;
_student.FirstName = this.FirstName;
_student.LastName = this.LastName;
Model.Utilities.SaveStudent(_student);
}
}
}
來源
2013-01-09 13:52:57
JDB
順便提一下,問題很簡單:清晰,簡潔幷包含示例代碼。 – JDB