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

问题描述

| 我有以下代码来处理由拇指控件引发的鼠标拖动事件。它可以在后面的标准代码(例如SettingView.xaml和SettingView.xaml.cs)上正常工作 但是如何在我的Settingviewmodel.cs文件中处理此问题。 到目前为止,我已经能够使用带有参数的DelegateCommand(或RelayCommand)来连接点击,但是如何从事件发送的参数中获取输入呢?例如,拖动事件提供事件参数e.Horizo​​ntalChange和e.VerticalChange。请看下面我的代码原型。 任何优雅的解决方案都倍受赞赏。 提前致谢。 ================================================== =============================== SettingView.xaml 拇指名称= \“ 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;
        }
        }     

解决方法

        MVVM讨论通过直接将ViewModel中声明的Command绑定到View来摆脱后面的代码。这对于具有ICommand属性的Button之类的控件很有用,您可以在其中绑定命令。但是,在所有其他情况下,如果控件未公开ICommand或我们希望在异常事件上具有特定行为,则可以使用以下两种方法之一: 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命令。 您可以在此处找到有关使用“附加行为”的不错的教程     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...