【发布时间】:2017-10-27 13:07:55
【问题描述】:
问题:我有一个 WPF 项目,我想在其中使用 MVVM-pattern。我想使用 ICommand 来抽象事件。但问题是我无法取回我的 EventArgs,因为它位于命令“后面”(例如 OnDrop 路径)。
信息: ICommand 用于抽象事件,因为命令可以多次使用。命令更集中于背后的逻辑(MVVM-Pattern)。
我正在使用System.Windows.Interactivity 和中继命令。
RelayCommand.cs
public class RelayCommand : ICommand
{
private readonly Predicate<object> _canExecute;
private readonly Action<object> _execute;
public RelayCommand(Predicate<object> canExecute, Action<object> execute)
{
_canExecute = canExecute;
_execute = execute;
}
public bool CanExecute(object parameter)
{
return _canExecute(parameter);
}
public void Execute(object parameter)
{
_execute(parameter);
}
public event EventHandler CanExecuteChanged
{
add => CommandManager.RequerySuggested += value;
remove => CommandManager.RequerySuggested -= value;
}
}
我尝试了以下解决方案:
1.依赖对象的行为
我无法取回我的事件参数。
2.关联对象和 OnAttached 的行为
https://wpftutorial.net/Behaviors.html
在这里我遇到了同样的问题,无法取回我的 EventArgs。
3.绑定方法
MainView.xaml
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
<i:EventTrigger EventName="Drop">
<ei:CallMethodAction TargetObject="{Binding}" MethodName="OnRectangleDrop"/>
</i:EventTrigger>
这对我有用,但问题是 WPF 在 XAML 或代码中方法名称已更改时不会更改名称。
问题: 如何在不使用框架或库的情况下以有效的方式让我的 EventArgs 退出我的命令?
【问题讨论】:
-
CommandParameter通常用于将参数传递给视图模型。但还有其他方法。您遇到问题的具体事件是什么?为什么你需要它的EventArgs? -
是的,例如我需要
DragEventArgs来获取被删除文件的路径。 -
只需在代码后面附加事件处理程序并从那里调用您的命令。像 drop 这样的事件是视图的一部分,它们的事件参数也是视图的一部分。你不想让你的视图模型依赖于视图特定的类。
-
实际上,如果您在代码中附加处理程序,则不需要命令。在后面的代码中提取文件 drom
DragEventArgs并在视图模型中调用方法,例如viewModel.ProcessDroppedFiles(files)。