簡體   English   中英

WPF MVVM代碼背后

[英]WPF MVVM Code Behind

我嘗試在我的WPF MVVM項目中避免代碼隱藏在視圖中。

但是我有一些非常具體的觀點。 例如,當控件獲得焦點時,我希望突出顯示全文(即使用戶單擊文本框)。

在這里,我可以選擇在視圖模型中處理它(然后需要了解視圖,我想避免它)。

我還有一些其他的代碼,當用戶在鍵盤上向左或向右按​​下時,它會向用戶界面做一些事情(他們只對視圖進行更改,而不是對模型或視圖模型進行更改)再次我認為最好的地方因為這些是在視圖背后的代碼中。

所以我問的是代碼是否只影響視圖(例如光標移動,選擇文本框中的所有文本等等,而不是模型或視圖模型,是否可以將其放在代碼中,而不是比其他地方。

想知道這里的最佳做法是什么,或者是否有其他人有更好的建議在哪里放置此代碼。

所以我問的是代碼是否只影響視圖(例如光標移動,選擇文本框中的所有文本等等,而不是模型或視圖模型,是否可以將其放在代碼中,而不是比其他地方。

不僅沒關系,而且強烈鼓勵 MVVM不是為了讓你在ViewModels中編寫成千上萬條丑陋的代碼行,而是為了使代碼可測試並引入關注點分離

如果它與視圖完全相關(您的“焦點”示例是一個完美的示例),那么只需將其寫入后面的代碼中即可。

如果行為僅與UI相關,則不應將其放在ViewModel中。 您給出的突出顯示示例就是這種情況的一個很好的例子。 話雖如此,我建議你避免重復你的代碼(例如)創建一個自定義控件,當它有焦點時突出顯示文本。 這樣,您可以在盡可能多的視圖中重用控件,您的視圖可以避免代碼隱藏,如果您優化控制,優化就會全面發生。

編輯:

根據Ravi的回答,Behaviors也是一種引入UI相關邏輯的方法,同時讓View免於代碼隱藏。 但是,如果您發現自己反復聲明具有相同行為的相同控件,我認為最好創建一個包含該行為的控件。

話雖如此,如果所述UI邏輯在一個視圖中只出現一次,您可以考慮將其置於代碼隱藏中。 雖然很少提前知道你不會在其他地方需要那種邏輯。

編輯:

我認為@ ken2k使用強烈的鼓勵是指不把它放在我也提倡的ViewModel中。 正如他所說,UI邏輯應該在View中實現。 現在,有幾種方法可以做到這一點。 其中之一是直接在代碼隱藏中編碼,這可能導致重復的代碼和維護問題。 此外,如果您使用單元測試,它可能會讓您陷入困境。 第二種是將這種邏輯編碼為行為,這是封裝UI代碼的好方法。 然后,您可以對行為進行單元測試,以確保其正常工作。 但是,您可以找到(正如我在許多項目中所做的那樣),您已經開始使用行為標簽為XAML中的每個TextBox添加胡椒。 如果這種情況開始發生,我會(並且已經)創建一個'HighlightedTextBox'控件並在我的XAML中使用它。 總之,我的建議與ken2k並不矛盾,但它是解決在為View放置邏輯時可能遇到的一些問題的指針。

使用自定義控件作為@Boluc Papuccuoglu建議,是不錯的選擇,但在使用之前我想讓你看看這里的行為在WPF介紹

強烈建議您將所有視圖邏輯邏輯放在一個位置。 您應該始終在XAML和代碼中保留View內容,而不是污染ViewModel

ViewModel職責是僅包含可以進行單元測試的數據部分 使用ViewModel中的UI內容,您將難以進行單元測試

根據MSDN中的鏈接,后面的代碼定義:

代碼隱藏是一個術語,用於描述在標記編譯XAML頁面時與標記定義的對象連接的代碼。

如您所見, 后面的代碼是您視圖的部分類 一半是通過根元素的x:Class屬性聲明的,另一半是以后面的代碼形式聲明的。 所以,按照我的說法,所有的UI內容應該放在一個地方,你不應該在將視圖內容放在代碼中之后再三思而后行。 (這就是它的意思)。 MVVM從未意味着沒有任何代碼背后的設計。

此外,ViewModel的職責是通過數據綁定向您的視圖提供數據。 它永遠不應該知道UI的東西。

在這里閱讀更多相關信息 - WPF中的代碼隱藏和XAML

你想要多少代碼進行單元測試? 如果您的視圖可以在控件獲得焦點時觸發命令,並且您的視圖模型可以以編程方式觸發事件以突出顯示該控件中的文本,那么您將擁有使用模擬對象對該行為進行單元測試所需的一切。 即使您不想進行單元測試(或者因為您公司的bean計數器不會給您時間/預算而這樣做),然后將該功能放在附加行為中意味着它們可以在其他地方使用。 我不像這個網站上的其他人那樣是硬核MVVM純粹主義者,但我可以誠實地說,即使在我工作過的最大的企業應用程序中,我也從未見過絕對需要WPF代碼隱藏的情況。 。

暫無
暫無

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

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