我发展与MVVM模式,RelayCommand等 一个WPF应用程序,我在这个问题上读了很多,但我并不清楚:WPF和MVVM。结合活动
所有我想要做的是移动形状,例如像一个椭圆,并捕获它的最终位置,放入数据库。
但我无法将事件(MouseLetButtonDown,MouseLeftButtonUp和MouseMove)绑定到命令。我已阅读关于附加行为,但我需要事件的参数(MouseButtonEventArgs和MouseEventArgs)来检索位置。
解决方案?
我发展与MVVM模式,RelayCommand等 一个WPF应用程序,我在这个问题上读了很多,但我并不清楚:WPF和MVVM。结合活动
所有我想要做的是移动形状,例如像一个椭圆,并捕获它的最终位置,放入数据库。
但我无法将事件(MouseLetButtonDown,MouseLeftButtonUp和MouseMove)绑定到命令。我已阅读关于附加行为,但我需要事件的参数(MouseButtonEventArgs和MouseEventArgs)来检索位置。
解决方案?
这适用于Silverlight的,所以应该对WPF的工作(或者至少它应该稍作修改)
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<cmd:EventToCommand Command="{Binding MouseCommand, PassEventArgsToCommand="True", CommandParameter="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
当编写一个MVVM图形应用程序,它是很有诱惑力的尝试发送你需要的所有事件转到视图模型。但是,在命令中处理特定于视图的鼠标事件参数与MVVM原理和松散耦合的目标相反。
解决此问题的方法是将操作抽象为视图可以执行的任务,然后通过操作和数据将其结果传回视图模型。如果你想在代码隐藏中执行少量的代码来支持这个,MVVM警察不会来带你的孩子。但更好的方法是增加与行为的交互性。行为是可重用的功能块,没有代码隐藏功能,可以很好地与需要交互性的MVVM模式和应用程序配合使用,否则需要向您的XAML添加事件处理程序。
见我的答案在这里,它使用的鼠标事件拖动图形对象行为的一个完整的例子:
与您的互动由视图,视图模型可以进行坚持数据和命令。
非常感谢你,正是我所需要的。现在我更好地理解模式MVVM。 – 2011-01-25 21:13:36
你可以找到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基于通风的代码背后。
你忘了提及它使用混合 – TigOldBitties 2013-11-29 19:12:51