2011-01-24 72 views
8

我发展与MVVM模式,RelayCommand等 一个WPF应用程序,我在这个问题上读了很多,但我并不清楚:WPF和MVVM。结合活动

所有我想要做的是移动形状,例如像一个椭圆,并捕获它的最终位置,放入数据库。

但我无法将事件(MouseLetButtonDown,MouseLeftButtonUp和MouseMove)绑定到命令。我已阅读关于附加行为,但我需要事件的参数(MouseButtonEventArgs和MouseEventArgs)来检索位置。

解决方案?

回答

2

这适用于Silverlight的,所以应该对WPF的工作(或者至少它应该稍作修改)

<i:Interaction.Triggers> 
<i:EventTrigger EventName="MouseLeftButtonDown"> 
<cmd:EventToCommand Command="{Binding MouseCommand, PassEventArgsToCommand="True", CommandParameter="{Binding}"/> 
</i:EventTrigger> 
</i:Interaction.Triggers> 
+1

你忘了提及它使用混合 – TigOldBitties 2013-11-29 19:12:51

8

当编写一个MVVM图形应用程序,它是很有诱惑力的尝试发送你需要的所有事件转到视图模型。但是,在命令中处理特定于视图的鼠标事件参数与MVVM原理和松散耦合的目标相反。

解决此问题的方法是将操作抽象为视图可以执行的任务,然后通过操作和数据将其结果传回视图模型。如果你想在代码隐藏中执行少量的代码来支持这个,MVVM警察不会来带你的孩子。但更好的方法是增加与行为的交互性。行为是可重用的功能块,没有代码隐藏功能,可以很好地与需要交互性的MVVM模式和应用程序配合使用,否则需要向您的XAML添加事件处理程序。

见我的答案在这里,它使用的鼠标事件拖动图形对象行为的一个完整的例子:

与您的互动由视图,视图模型可以进行坚持数据和命令。

+0

非常感谢你,正是我所需要的。现在我更好地理解模式MVVM。 – 2011-01-25 21:13:36

0

你可以找到XCommand开源CodePlex上WPF extention这里的项目,xcommand.codeplex.com,这可以让你绑定喜欢的MouseMove,任何的MouseLeftButtonDown事件,从WPF的UIElement继承任何UI元素的命令和CommandParameter。

你可以在这里找到windows store 8应用程序和windows桌面应用程序版本的类库。你想要WPFXCommand来处理WPF桌面应用程序。 在这里,它是如何工作的。 添加WPFXCommand.dll作为您的愿望项目的参考。

添加的命名空间,如下面的XAML文件:

xmlns:XCmd="clr-namespace:WPFXCommand;assembly=WPFXCommand" 

现在,你可以绑定命令CommandParameter在任何UI元素的任何可用事件继承WPF的UIElement作为如下:

<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> 

希望这会帮助你摆脱e基于通风的代码背后。