WPF MVVM-Light如何在ViewModel中使用传递的DragEventArgs

Mag*_*agB 4 wpf event-handling mvvm-light

我在这里阅读了许多有关WPF MVVM Light的问题和答案,但是答案仅显示了一侧(XAML代码如下),根本没有ViewModel代码。

<i:Interaction.Triggers>
<i:EventTrigger EventName="Drop">
    <cmd:EventToCommand Command="{Binding Mode=OneWay, Path=DropCommand}"
                        PassEventArgsToCommand="True" />
</i:EventTrigger>
Run Code Online (Sandbox Code Playgroud)

我在XAML网格控件中使用,我想将Windows资源管理器中的拖放文件应用于我的(wpf)应用程序。我严格使用MVVM模式(完全避免使用代码)。JFYI,通常在代码后面,Drop-Event的事件处理程序具有2个参数:object类型的sender和DragEventArgs类型的e。我只需要EventArgs。我的问题不是关于如何将DragEventArgs从XAML直接传递给ViewModel,而是关于如何在ViewModel中获取和使用DragEventArgs(C#代码)。在ViewModel中,我这样编写Command:

public RelayCommand<DragEventArgs> DropCommand
{
    get
    {
        return _dropCommand ?? (_dropCommand = new RelayCommand<DragEventArgs>(Drop);
    }
}
private void Drop()
{
   // do something here
}
Run Code Online (Sandbox Code Playgroud)

我想我的DropCommand中缺少某些内容,因此可以使用e(DragEventArgs的类型)。先感谢您。

Viv*_*Viv 5

您需要类似:

您在函数定义中缺少的内容用于指定您期望的参数类型:)

private RelayCommand<DragEventArgs> _dropCommand;
public RelayCommand<DragEventArgs> DropCommand {
  get {
    return _dropCommand ?? (_dropCommand = new RelayCommand<DragEventArgs>(Drop));
  }
}
private static void Drop(DragEventArgs e) {
  // do something here
}
Run Code Online (Sandbox Code Playgroud)

或以拉姆达式的方式(我喜欢我的拉姆达式的):

public RelayCommand<DragEventArgs> DragCommand { get; private set; }

public MainViewModel() {
  DragCommand = new RelayCommand<DragEventArgs>((e) =>  /* Handler Code */ , (e) => true);
}
Run Code Online (Sandbox Code Playgroud)