我发现了这个:Close Window from ViewModel这让我开始修改我的 DelegateCommand 类来处理参数。但我无法解决语法问题。
这是我的 DelegateCommand 类,以及我尝试创建但收效甚微的 DelegateCommand 类:
public class DelegateCommand : ICommand
{
private readonly Action _action;
public DelegateCommand(Action action)
{
_action = action;
}
public void Execute(object parameter)
{
_action();
}
public bool CanExecute(object parameter)
{
return true;
}
#pragma warning disable 67
public event EventHandler CanExecuteChanged { add { } remove { } }
#pragma warning restore 67
}
public class DelegateCommand<T> : ICommand
{
private readonly Action _action;
public DelegateCommand(Action action)
{
_action = action;
}
public void Execute(object parameter)
{
_action();
}
public bool CanExecute(object parameter)
{
return true;
}
#pragma warning disable 67
public event EventHandler CanExecuteChanged { add { } remove { } }
#pragma warning restore 67
}
Run Code Online (Sandbox Code Playgroud)
这是我在视图模型中所做的:
public ICommand RowEditEndingAction
{
get { return new DelegateCommand(RowEditEnding); }
}
public ICommand UpdateDatabaseClick
{
get { return new DelegateCommand<object>(UpdateDatabase); } //THIS LINE HAS THE ERROR
}
Run Code Online (Sandbox Code Playgroud)
以及将被调用的实际方法:
public void UpdateDatabase(object parameter)
{
Window w = (Window)parameter;
// A bunch of stuff that works is removed for brevity
w.Close();
}
Run Code Online (Sandbox Code Playgroud)
编译器不喜欢我的 UpdateDatabaseClick,特别是说 DelegateCommand 的参数有问题,但我不知道我做错了什么(尽管我认为它是语法......)。我需要改变什么?在我将参数添加到 UpdateDatabase 之前,这一切都有效,并且只有 DelegateCommand(没有模板类)。但在那种情况下,我无法关闭窗户。
这DelegateCommand<T>是您正在调用的类的构造函数:
public DelegateCommand(Action action)
Run Code Online (Sandbox Code Playgroud)
这是你如何称呼它的:
new DelegateCommand<object>(UpdateDatabase)
Run Code Online (Sandbox Code Playgroud)
在那里,UpdateDatabase声明如下:
public void UpdateDatabase(object parameter)
Run Code Online (Sandbox Code Playgroud)
现在,您正在调用的构造函数需要一个Action. 这是一个没有返回值的无参数方法。
但是,您传入的是一个带有一个参数的方法。这就是编译器所抱怨的。
您实际上可能想要做的是接受任何带有一个参数的方法- 为此,您可以使用 type Action<T>。由于您的参数大概应该具有作为类型参数传递给您的DelegateCommand<T>类的相同类型,您可以像这样声明您的构造函数:
public DelegateCommand(Action<T> action)
Run Code Online (Sandbox Code Playgroud)
现在,您还需要更新存储操作的支持字段的类型:
private readonly Action<T> _action;
Run Code Online (Sandbox Code Playgroud)
最后,正如_action现在期望的参数一样,您需要在调用_actionin时传递该参数DelegateCommand<T>.Execute。通常,您希望将parameter收到的对象作为Execute方法的参数传递。但是,该值始终键入为object,而您希望T在方法中使用类型为强类型的值。因此,您还必须添加额外的演员表:
public void Execute(object parameter)
{
_action((T)parameter);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9845 次 |
| 最近记录: |