WPF mvvm传递(使用命令)并在视图和视图模型之间接收事件和eventargs参数

时间:2011-06-13 10:00:23

标签: wpf mvvm event-handling command

我有以下代码处理拇指控件抛出的鼠标拖动事件。它适用于标准代码,例如SettingView.xaml和SettingView.xaml.cs

但我如何在我的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 个答案:

答案 0 :(得分:1)

MVVM谈到通过将ViewModel中声明的Command直接绑定到View来摆脱背后的代码。这适用于像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))
}

虽然我们正在向这里的代码添加代码,但我觉得很好,因为我们没有在even处理程序中添加任何UI逻辑。它只在ViewModel中使用适当的参数执行命令。

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

的精彩教程