所以我對MVVM相當陌生,我一直在關於用戶輸入驗證的一些問題上掙扎。 WPF有一些內置的功能,似乎像「魔術」一樣工作,並且通常我知道「魔術」不好。WPF的「好」特性真的很棒嗎?還是他們太控制?
例如:如果綁定TextBox
到具有類型的double
和用戶輸入的「hello」成TextBox
一個屬性,WPF自動顯示TextBox
圍繞紅色邊框通知該輸入的用戶無效。
這一切都很好,但它確實看起來像「魔法」。一位經驗豐富的開發人員告訴我,WPF和類似的應用程序構建者想要控制太多。他表示,在Web開發中,View不知道該屬性是什麼類型。這對我有意義。所以這導致我的一般問題 - 應該WPF視圖瞭解屬性類型? - 如果我將Property屬性聲明爲string
,那麼我可以通過視圖對完成控制。而不是必須解決WPF的「聰明」TextBox
「魔術」。
另一種表達我的問題的方式是 - 應該在Model或ViewModel中聲明屬性類型嗎?
我明白,如果你在型號爲double
,併爲string
在視圖模型申報物業類型必須在模型中分析。在我看過的MVVM應用程序的大多數示例中,Property類型在整個應用程序中都是相似的,但我認爲不理解它使用的「愚蠢」視圖會好很多。
返回我的示例:如果將該屬性聲明爲String
,則可以完全控制輸入所需的格式並防止無效輸入。這似乎是一個比信任WPF TextBox
更好的解決方案。
當您將一個'TextBox'綁定到double並鍵入像「hello」這樣的字符串時,我認爲實際發生的事情是WPF嘗試將您的double值設置爲字符串值,並引發異常。這種例外是導致紅色邊框出現在「TextBox」周圍並顯示錯誤消息,而不是任何特殊處理的原因。你可以輕易地在setter中爲你的double屬性拋出一個異常,並且會發生同樣的事情。我不會真的稱之爲「魔術」,只是異常處理:) – Rachel 2013-02-26 14:34:10
@Rachel我同意,但爲什麼不完全控制自己的輸入?是的,當類型是「double」時,可以稍微控制它,但不如它是一個字符串。你可以創建一個幾乎不可能破解的應用程序。我只是認爲'View'應該是一種愚蠢的! – 2013-02-26 14:39:00
我不知道爲什麼你會想要一個額外的圖層。 WPF有兩層:一個數據層和一個UI層。數據層應該代表你的數據。如果你有一個數字,它應該是一個數字數據類型,而不是一個字符串數據類型。用戶界面層意味着爲用戶提供了一個友好的數據界面,因此您可以使用「文本框」來顯示您的數字值,以便最終用戶可以輕鬆編輯它。如果你強制你的數據層使用字符串而不是數字,因爲你使用的是「TextBox」,那麼你讓UI控制你的應用程序,這不是WPF應該如何工作的。 – Rachel 2013-02-26 14:48:16