2010-11-08 77 views
3

我想得到一些意見,何時/如果可以將代碼放在代碼隱藏中。我只在這一個不到一年的時間。所以,我仍然認爲自己很「綠色」。我來自Delphi背景。所以,學習曲線已經很不錯了,可以說是學習最少的WPF,XAML,C#,Unity,Prism,MEF,.NET,MVVM等等...很有趣但很具挑戰性。把它放在代碼隱藏或在ViewModel

剛開始不到一年前,辦公室裏的想法在代碼隱藏方面沒有任何代碼,如果有可能,並且沒有在虛擬機中查看特定的代碼。那麼,我已經多次絞盡腦汁決定如何將字面上的所有內容都推送到虛擬機中,並且保持我認爲是虛擬機外部的特定代碼的代碼,以便幾乎每次都縮短。我現在要說的是,我開始認爲隱藏代碼並不總是壞的或「錯誤的」。我最近試圖通過試圖將任何代碼隱藏到VM中來清除我們的一些觀點,這導致我在http://blog.functionalfun.net/2008/09/hooking-up-commands-to-events-in-wpf.html找到了一個整潔的工廠類。這允許您將路由事件綁定到VM中的ICommand。它的功能就像一個魅力,我能夠顯着減少我們的一些代碼隱藏。然而,在這樣做之後,我現在質疑我的決定。除非絕對需要,否則我的方法遵循隱含代碼錯誤/錯誤的哲學。現在我花了一點時間思考它,但我不確定重構是否是最好的主意。

以下是我重構的視圖示例。我們有一個新的帳戶視圖,用戶輸入一個SSN,並且必須在新帳戶創建之前重新鍵入SSN。該視圖具有顯示文本的標籤,以告訴用戶SSN和重定密鑰SSN是否不匹配,並且OK按鈕在它們兩者匹配之前未被啓用。一旦SSN和rekey SSN匹配,標籤消失(是的,我知道......我討厭那個,但我只是開發者)並且確定按鈕已啓用。因此,隱藏/顯示標籤以及確定按鈕的啓用/禁用是由SSN中的TextChanged事件和SSN密鑰更改文本框觸發的。最初,我有代碼隱藏的邏輯來比較兩個文本框的值,並適當地設置viewmodel屬性,以更新標籤的可見性和OK按鈕的啓用屬性(是他們的屬性綁定在XAML中)。在找到這個新的工廠類之後,我用它將所有代碼推送到視圖模型中,並且視圖的工作方式就像以前那樣沒有代碼隱藏。在成功重構視圖之後,我現在第二次猜測重構的決定。

我擔心的是,如果我們希望在未來有不同的觀點,而新的觀點不想以這種方式處理不匹配的SSN,那該怎麼辦?也許新視圖允許用戶輸入不匹配的SSN,然後在點擊確定按鈕時顯示錯誤消息。新視圖是否必須接受在視圖模型中爲文本框中的每個按鍵執行的額外代碼開銷?這聽起來並不正確。我開始認爲視圖模型應該包含支持視圖需要的內容,但不是爲視圖做所有事情。該視圖應該能夠根據視圖模型中的某些內容做出決定,但不依賴於虛擬機來握住它的手 - 對嗎?

+1

將來,您應該用一種容易讓讀者弄清楚你想問什麼的方式來設置你的問題的格式。 – Grandpappy 2010-11-08 23:16:31

回答

5

XAML和匹配的.cs文件組成視圖。因爲只要它是爲了視圖本身,將代碼放在代碼隱藏中沒有任何問題。

代碼隱藏當然沒有什麼「錯誤」。

以下是我會處理你的SSN例如:

  1. 地結合SSN字段的視圖模型
  2. 綁定確定按鈕,在視圖模型的一個命令的屬性(我是一個大代表命令概念的粉絲)
  3. 該命令應該實現CanExecute部分,並且只在兩個SSN匹配時才返回true。

似乎SSN匹配不是一個問題,這是一種商業慣例。它屬於視圖模型。在該視圖中,您的應用顯示 SSNs是否匹配。