2010-06-22 31 views
6

我發現實際上有兩種方法來處理mvvm模式控件上的鼠標事件。使用MVVM模式處理控件上的鼠標事件 - 最佳實踐 -

這兩種方法實際上是1路:

MVVM光工具包由http://mvvmlight.codeplex.com/

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="SelectionChanged"> 
     <cmd:EventToCommand 
      Command="{Binding SelectionChangedCommand}" 
      CommandParameter="{Binding SelectedItems, 
       ElementName=MyDataGrid}" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

與行爲的混合interactivity.dll

<i:Interaction.Triggers> 
    <i:EventTrigger EventName=」MouseLeftButtonDown」> 
    <Behaviours:ExecuteCommandAction Command=」{Binding MyCommand}」 CommandParameter=」{Binding MyCommandParameter}」/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

你知道有更好的方法嗎?

主持人:爲什麼我的最後6個xaml代碼行看不見? 它們被IE和Iron瀏覽器吞噬。 請您舉報管理員修復該代碼腳本嗎?它並不經常工作。證明:http://img251.imageshack.us/img251/5236/errorxt.png

+0

在StackOverflow代碼中,必須縮進四個空格才能將其識別爲代碼並正確格式化。我認爲你不知道這一點,因爲你問的線條根本沒有縮進。我編輯你的問題來解決這個問題。編輯器頂部有一個按鈕,可讓您快速縮進:它的圖標是全1和零。 – 2010-06-22 08:57:36

+0

一如既往,我使用零/一個按鈕並粘貼代碼。 – msfanboy 2010-06-22 09:11:34

+0

然後我猜你的粘貼出了問題,因爲它沒有在編輯文本框中縮進。我從不再使用零/一個按鈕,所以我忘記了它的工作原理。 – 2010-06-22 09:39:18

回答

8

如果您需要在任意位置處理MouseDown,那麼這些都是很好的方法。

但是,這些情況通常很少和很遠。通常有一個更簡單的方法:

  • 你確定你的對象不是真的只是看起來不像按鈕的按鈕?如果是這樣,使它們成爲真正的Button對象並對它們進行模板化,以便以您想要的方式查看。
  • 您確定您的對象只是列表中對象的選擇區域嗎?如果是這樣,將容器從ItemsControl更改爲ListBox和restyle ListBoxItem以使用選擇區域。
  • 您的對象是被選中的圖形路徑嗎?使用其內容是路徑本身的ToggleButton。

還有很多其他的例子。事實上,找到MouseDown映射到Command並且沒有更簡單的方法來執行相同的事情的情況並不常見。

+0

您提到MouseDown explecitly和往往,鼠標點擊什麼?上述方法對它不好嗎?我經常看到帶有關於mvvm和事件的附加行爲的鼠標點擊。但那些我將不得不編寫自己的... – msfanboy 2010-06-22 09:35:40

+1

你如何定義「鼠標點擊」?在WPF中,這個概念並不存在。你有按鈕點擊,但沒有鼠標「點擊」這樣的事情:鼠標按鈕向下和向上是單獨的事件。對於按鈕點擊,您不需要將Click事件映射到命令的方式,因爲Button類已具有可直接使用的Command屬性。 – 2010-06-22 09:45:15

+1

對不起,它似乎我的代碼片段誤導:MouseLeftButtonDown 我從來不想談論按鈕...我知道他們有一個命令屬性綁定... – msfanboy 2010-06-25 20:18:22

7

總是有另一種選擇。您可以在View的代碼隱藏中處理WPF事件,並在ViewModel上調用適當的方法。 MVVM模式不禁止在視圖的代碼隱藏文件中編寫任何代碼。

WPF Application Framework (WAF)視圖模型示例應用程序演示如何能工作。

2

XCommand開源codeplex項目有更好的方式來處理基於事件的Command/CommandParameter綁定。在這裏找到,xcommand.codeplex.com

這裏是下面的示例代碼:

<Grid> 
    <TextBlock Margin="20,30,20,0" VerticalAlignment="Top" Height="80" x:Name="XTextBlock" 
      Foreground="{Binding FgColor, Mode=TwoWay}" 
      XCmd:MouseMove.Command="{Binding TextBlockPointerMovedCommand}" 
      XCmd:MouseLeftButtonDown.Command="{Binding TextBlockPointerPressedCommand}" 
      XCmd:MouseLeave.Command="{Binding TextBlockPointerExitedCommand}"  
      Text="{Binding Description, Mode=TwoWay}"> 
    </TextBlock> 
    <Grid Grid.Column="1" Background="{Binding BgColor, Mode=TwoWay}" 
      XCmd:MouseMove.Command="{Binding GridPointerMovedCommand}" 
      XCmd:MouseMove.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}" 
      XCmd:MouseLeftButtonDown.Command="{Binding GridPointerPressedCommand}" 
      XCmd:MouseLeftButtonDown.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}" 
      > 
    </Grid> 
</Grid> 

希望這會有所幫助。