2011-05-23 22 views
29

嗨,我最近看了WPF,並開始瞭解事件和命令。我通常使用Commands on Button clicks,這會導致方法在我的「視圖模型」中運行。何時通過WPF中的命令使用事件?

是否有可能通過使用通訊使Button對任何其他事件(如MouseOver事件)作出反應?或者在這種情況下使用WPF事件?

如果要使用WPF事件,那麼事件處理程序實現是否應該在視圖模型中調用一個方法來保持關注點的高度?

+0

如果您還沒有,我強烈建議Laurent Bungion的MIX和Techday視頻流,包括優秀的MIX11深度MVVM廣播,其中涵蓋了很多這些MVVM邊緣情況。 – Firoso 2011-05-24 16:09:13

回答

13

這是一個公平的問題,它是MVVM體系結構領域中常見但「解決」(有爭議的)問題。如果您使用的是MVVM框架,則可能會發現與EventToCommand Behavior類似的內容,here是MVVM Light Toolkit的示例。

總之,這允許你映射一個事件的命令,像這樣綁定:

<Rectangle Fill="White" 
     Stroke="Black" 
     Width="200" 
     Height="100"> 
<i:Interaction.Triggers> 
    <i:EventTrigger EventName="MouseEnter"> 
     <cmd:EventToCommand Command="{Binding TestCommand, 
             Mode=OneWay}" 
      CommandParameter="{Binding Text, 
           ElementName=MyTextBox, 
           Mode=OneWay}" 
      MustToggleIsEnabledValue="True" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 
</Rectangle> 

更新:

還有另外兩個「合理」的解決方案,這一問題:

一個使用現在認爲的傳統「AttachedCommandBehavior」擴展找到here.

另一個有點刺激,但可行。

  1. 純粹在視圖中通過en 事件捕獲命令。
  2. 查詢控制的DataSource步驟
  3. 搶串結合靶 標識符表示的命令 (可能使用在 視圖一個const字符串)
  4. 上 調用的命令經由反射和 通視圖模型在命令參數中。

這看起來很糟糕,但我相當肯定實際上比僅使用傳統命令 綁定更快一點。爲了確保我需要看IL,我認爲這不重要。

/更新

我想不過需要注意的是,這並不總是一個理想的情況。我發現更多的時候,我使用EventToCommand來解決設計問題。請考慮以下內容:

  • 使用事件和代碼來處理與用戶界面相關的行爲。
  • 考慮創建具有命令綁定的自定義控件(如果適用的話),特別是如果您發現自己使用命令來封裝事件驅動的bevahior以設置綁定的數據,然後將其反映在視圖中。 (即根據接近控件或類似的東西設置透明度值)
  • EventToCommand應該很可能只用於處理「類命令」事件(雙擊等)而非反應事件(鼠標懸停)。但是沒有什麼可以阻止這一點。按你認爲合適的方式實施。

最重要的可能是你記得你是開發者。指導方針本身並不能解決問題,但考慮指導方針可能會明顯地解決問題。