2011-08-14 46 views
1

我在我的應用程序中使用了MVVM模式。我有一些問題在哪裏處理Usercontrol的事件。MVVM中的用戶控件事件或MVVM中的視圖

我有一個名爲DatePicker的用戶控件包含兩個文本框(用於開始日期和結束日期)以及從特定日期範圍的模型中獲取數據的按鈕。

當我集中任何文本框,我需要改變其邊框顏色(比如綠色)。當用戶再次輸入錯誤的日期值時,我需要用紅色更改邊框顏色。

如果用戶輸入錯誤的日期值,我還需要禁用按鈕。

處理這些事件的最佳做法是什麼?

在此先感謝。

注意:我修改這樣的方式,用戶可以輸入日期手動此外,當開始日期文本框的重點是日曆將顯示爲一個彈出,當他/她專注結束日期文本框中再次日曆應用將顯示阻止在開始日期文本框中選擇/鍵入的日期。

對不起,對於延遲編輯。

回答

2

如果您需要根據用戶的無效數據更新UI的外觀,您應該查看Data Validation。這是另一個關於這個話題的useful link

要將邊框顏色更改爲綠色,應考慮使用樣式。不幸的是,我目前無法爲你測試這個,但你應該看看屬性FocusVisualStyle

的MSDN文檔指出:

獲取或設置,使外觀, 效果或其他樣式特徵的定製,這將適用於本 元素時捕獲鍵盤焦點的屬性。

希望有所幫助!當我裝上裝有VS的電腦時,我會試着看看能否使用FocusVisualStyle屬性一起獲得一個很好的示例。我還沒有使用它,所以這應該是有趣的。 :O)

編輯:

好了,所以對於 「專注,彰顯TextBox邊境綠色」 可以使用非常類似這樣的風格。

<Window.Resources> 
     <Style TargetType="TextBox"> 
      <Style.Triggers> 
       <Trigger Property="IsFocused" Value="True"> 
        <Setter Property="BorderBrush" Value="Green" /> 
        <Setter Property="BorderThickness" Value="2" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resources> 

我把BorderThickness增加到2,所以綠色的變化會更明顯。

+0

關於事件應該在MVVM模式下處理的問題。任何如何感謝您的答案。 – Syed

+0

好,如果我正確理解你的問題,你不一定需要創建事件。例如,想要更改邊框顏色是您想要作爲樣式而不是事件進行的操作。在無效輸入上更改邊框顏色爲使用數據驗證的良好狀態。 –

+0

如果您在決定是否將事件處理置於代碼後面或使用命令時遇到問題,請參閱以下有用問題:http://stackoverflow.com/questions/6137771/events-rather-than- commands-in-mvvm –

2

處理所描述事件的最佳做法是不使用事件。使用樣式可以更改焦點元素的視覺外觀,啓用/禁用按鈕的命令以及驗證,以便在輸入錯誤數據時更改控件的外觀。

用戶控件中仍有用例事件。在需要時,通常最好的做法是將事件處理程序放在控件的代碼隱藏中,並通過設置DataContext上的已知屬性使事件處理程序與視圖模型進行通信。如果你這樣做,創建一個接口是一個好主意,這將明確控制和視圖模型之間互操作的本質,並限制用戶控制需要知道它正在與之通信的對象。

+0

所以,你的意思是說,在MVVM模式下,「視圖」可以包含代碼,也可以用於事件處理? – Syed

+0

當然。例如:一個列表框,其中單擊所選項目或按下F2可讓您編輯其文本,並且您可以按ESC取消編輯或按ENTER鍵保存。要做到這一點,你必須在視圖中處理鼠標和按鍵事件。視圖模型需要暴露一個'Text'屬性和一個'IsEditingText'屬性(ItemTemplate中的樣式用於確定TextBox或TextBlock是否應該出現Text)。最終,這演變成一個自定義控件,用於實現「IEditableText」接口的視圖模型。 –