2011-06-13 61 views
1

我有以下代码处理由拇指控件抛出的鼠标拖动事件。它适用于背后的标准代码,如SettingView.xaml和SettingView.xaml.csWPF mvvm传递(使用命令)和接收视图和视图模型之间的事件和eventargs参数

但我如何处理这在我的SettingViewModel.cs文件。

到目前为止,我能够使用接受参数的DelegateCommand(或RelayCommand)连线点击,但是如何从事件发送的参数获取输入?例如,拖动事件提供事件参数e.Horizo​​ntalChange和e.VerticalChange。请看下面我的代码原型。

任何优雅的解决方案,非常感谢。

在此先感谢。

============================================== ==================================== SettingView.xaml

Thumb Name =“thumbWest” DragDelta =“thumbWest_DragDelta

SettingView.xaml.cs

private void thumbWest_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
    { 
     _captureMargin.Left = _captureMargin.Left + e.HorizontalChange; 

     if (e.HorizontalChange < 0) 
     { 
      // Drag towards West 
      _widthRect = _widthRect + Math.Abs(e.HorizontalChange); 
     } 

     if (e.HorizontalChange > 0) 
     { 
      // Drag towards East 
      _widthRect = _widthRect - e.HorizontalChange; 
     } 

}

回答

1

关于通过直接绑定在命令宣布摆脱后面的代码的MVVM会谈ViewModel到视图。这适用于像Button这样的控件,它们具有可绑定命令的ICommand属性。但在所有其他情况下,如果控件没有公开ICommand,或者我们想要在perticualr事件上发生特定行为,我使用以下两种方法之一:

1 - 如果我想要一个简单的方法,从事件处理程序中调用ViewModel命令(RelayCommand)哪个特定的参数。在你的情况下,代码看起来就像这样 -

private void thumbWest_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) 
{ 
    viewModel.DoSomthingCommand.Execute(new DoSomethingCommandParam(e.HorizontalChange)) 
} 

虽然我们将代码添加到这里后面的代码我觉得这是好的,因为我们没有在偶数处理程序中添加任何UI逻辑。它只是在ViewModel中使用适当的参数执行Command。

2 - 如果我完全反对将任何代码放在代码后面,我将创建一个附加行为来处理拖放并将其附加到控件。然后从附加行为调用ViewModel命令。 你可以找到一个关于使用附加行为的好教程here

+0

感谢您回复苏维克。 对于第一种方法,我没有在我的用户控件中的Viewmodel的实例,因为我遵循在Viewmodel和View之间使用XAML的框架Josh Smith示例。尽管在我的框架中我很难确定我是否能够通过这条道路。 对于第二个,我无法理解应该如何使用xaml。你能在这里提供一些XAML代码的原子球原型吗? – 2011-06-14 08:22:34

+0

我会给你一段时间如何使用第二种方法的例子。关于第一个,ViewModel必须是View的DataContext。因此,您可以通过将UserControl \ Window(View)的DataContext属性强制转换为ViewModel的类并使用它来获取ViewModel。 – 2011-06-14 08:52:00

+0

干杯Souvik,第一种方法工作正常,虽然它的临时工作,因为它击败了使用MVVM分层的目的。实际上,我可以将该方法公开并直接从viewmodel对象的实例中调用它。 现在我将再次尝试AttachedBehaviour – 2011-06-14 13:57:55

相关问题