嗨,我最近看了WPF,並開始瞭解事件和命令。我通常使用Commands on Button clicks,這會導致方法在我的「視圖模型」中運行。何時通過WPF中的命令使用事件?
是否有可能通過使用通訊使Button對任何其他事件(如MouseOver事件)作出反應?或者在這種情況下使用WPF事件?
如果要使用WPF事件,那麼事件處理程序實現是否應該在視圖模型中調用一個方法來保持關注點的高度?
嗨,我最近看了WPF,並開始瞭解事件和命令。我通常使用Commands on Button clicks,這會導致方法在我的「視圖模型」中運行。何時通過WPF中的命令使用事件?
是否有可能通過使用通訊使Button對任何其他事件(如MouseOver事件)作出反應?或者在這種情況下使用WPF事件?
如果要使用WPF事件,那麼事件處理程序實現是否應該在視圖模型中調用一個方法來保持關注點的高度?
這是一個公平的問題,它是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.
另一個有點刺激,但可行。
這看起來很糟糕,但我相當肯定實際上比僅使用傳統命令 綁定更快一點。爲了確保我需要看IL,我認爲這不重要。
/更新
我想不過需要注意的是,這並不總是一個理想的情況。我發現更多的時候,我使用EventToCommand來解決設計問題。請考慮以下內容:
最重要的可能是你記得你是開發者。指導方針本身並不能解決問題,但考慮指導方針可能會明顯地解決問題。
你可能想看看這篇文章:
WPF Commands vs Events Advantages/Disadvantages
其中談到事件和命令的不同用途。
就其他事件的命令而言,您應該看看EventToCommand作爲MVVMLight Toolkit的一部分,它允許您將任何事件附加到視圖模型中的命令。非常有用,特別是如果你已經在使用MVVM Light(我強烈推薦)。
如果您還沒有,我強烈建議Laurent Bungion的MIX和Techday視頻流,包括優秀的MIX11深度MVVM廣播,其中涵蓋了很多這些MVVM邊緣情況。 – Firoso 2011-05-24 16:09:13