【问题标题】:WPF mvvm passing (using command) and receiving event and eventargs parameters between view and viewmodelWPF mvvm 在视图和视图模型之间传递(使用命令)和接收事件和事件参数参数
【发布时间】:2011-09-13 19:30:11
【问题描述】:

我有以下代码来处理拇指控件抛出的鼠标拖动事件。它适用于标准代码,例如 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;
        }

}

【问题讨论】:

    标签: wpf mvvm event-handling command


    【解决方案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))
    }
    

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

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

    【讨论】:

    • 感谢您回复 Souvik。对于第一种方法,我的用户控件中没有 Viewmodel 的实例,因为我遵循在 Viewmodel 和 View 之间使用 XAML 的框架 Josh Smith 示例。尽管在我的框架中很简单,但不确定我是否能够通过这条路。对于第二个,我不明白应该如何使用 xaml。你能在这里提供一些xaml代码的大致原型吗?
    • 稍后我会给你一个例子来说明如何使用第二种方法。关于第一个,ViewModel必须是View的DataContext。所以可以通过将usercontrol\window(View)的DataContext属性转换为ViewModel的类来获取ViewModel并使用它。
    • Cheers Souvik,第一种方法效果很好,虽然它是临时工作,因为它破坏了使用 MVVM 分层的目的。事实上,我可以公开该方法并直接从 viewmodel 对象的实例中调用它。现在我将再次尝试 AttachedBehaviour
    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2021-12-18
    • 2017-09-24
    • 2020-09-11
    相关资源
    最近更新 更多