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

WPF mvvm在视图和viewmodel之间传递(使用命令)和接收事件和事件参数,wpf,mvvm,event-handling,command,Wpf,Mvvm,Event Handling,Command,我有以下代码来处理thumb控件引发的鼠标拖动事件。它在标准代码(如SettingView.xaml和SettingView.xaml.cs)上运行良好 但是如何在setingviewmodel.cs文件中处理这个问题呢 到目前为止,我能够使用DelegateCommand(或RelayCommand)连接点击,该命令接受参数,但是如何从事件发送的参数中获取输入呢?例如,拖动事件提供事件参数e.HorizontalChange和e.VerticalChange。请看下面我的代码原型 任何优雅的解

我有以下代码来处理thumb控件引发的鼠标拖动事件。它在标准代码(如SettingView.xaml和SettingView.xaml.cs)上运行良好

但是如何在setingviewmodel.cs文件中处理这个问题呢

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

任何优雅的解决方案都值得赞赏

提前谢谢

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

Thumb Name=“thumbWest”DragDelta=“thumbWest\u 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;
        }
private void thumbWest\u DragDelta(对象发送方,System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
_captureargin.Left=\u captureargin.Left+e.HorizontalChange;
如果(如水平变化<0)
{
//向西拖
_widthRect=\u widthRect+Math.Abs(如水平变化);
}
如果(如水平变化>0)
{
//向东拖曳
_widthRect=_widthRect-e.水平变化;
}

}MVVM谈到通过直接将ViewModel中声明的命令绑定到视图来消除代码隐藏。这对于Button等控件很有用,这些控件具有ICommand属性,您可以在其中绑定该命令。但是在所有其他情况下,当控件不公开ICommand或者如果我们希望在perticualr事件上执行特定行为时,我建议您e以下两种方法之一:

1-如果我想要一个简单的方法,我会定义一个事件处理程序,并从事件处理程序调用ViewModel命令(RelayCommand)来指定特定的参数-

private void thumbWest_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
   viewModel.DoSomthingCommand.Execute(new DoSomethingCommandParam(e.HorizontalChange))
}
虽然我们在这里为代码添加代码,但我觉得这很好,因为我们没有在偶数处理程序中添加任何UI逻辑。它只是在ViewModel中使用正确的参数执行命令

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

MVVM讨论如何通过直接将ViewModel中声明的命令绑定到视图来消除代码隐藏。这对于具有ICommand属性的控件(如Button)非常有用,您可以在其中绑定该命令。但在所有其他情况下,当控件不公开IC时ommand或者,如果我们想要在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中使用正确的参数执行命令

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

谢谢你回复Souvik。对于第一种方法,我的用户控制中没有Viewmodel的实例,因为我遵循框架Josh Smith示例,它在Viewmodel和View之间使用XAML。虽然很简单,但我不确定在我的框架中是否能够通过这是路径。对于第二种方法,我无法理解xaml应该如何使用。你能在这里提供一些xaml代码的大致原型吗?我稍后会给你一个如何使用第二种方法的示例。关于第一种方法,ViewModel必须是视图的DataContext。因此,你可以通过强制转换DataContext pr来获得ViewModelusercontrol\窗口(视图)的属性欢迎来到ViewModel类并使用它。Souvik,第一种方法很好用,尽管它是临时工作,因为它违背了使用MVVM分层的目的。事实上,我可以公开该方法并直接从ViewModel对象的实例调用它。现在我将再次尝试AttachedBehaviour感谢您响应Souvik.对于第一种方法,我的用户控制范围内没有Viewmodel的实例,因为我遵循的框架是Josh Smith示例,它在Viewmodel和View之间使用XAML。虽然非常简单,但我不确定在我的框架中是否能够通过这条路径。对于第二种方法,我不知道应该如何使用XAML。你能理解吗请在这里提供一些大致的xaml代码原型?稍后我将给您一个如何使用第二种方法的示例。关于第一种方法,ViewModel必须是视图的DataContext。因此,您可以通过强制转换usercontrol\window(View)的DataContext属性来获得ViewModel向ViewModel类提交并使用它。苏维克干杯,第一种方法很好用,尽管它是临时工作,因为它违背了使用MVVM分层的目的。事实上,我可以公开该方法并直接从ViewModel对象的实例调用它。现在我将再次尝试附加的行为