gpt4 book ai didi

c# - 带参数的命令

转载 作者:太空宇宙 更新时间:2023-11-03 21:23:11 25 4
gpt4 key购买 nike

我找到了这个: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
}

这是我在 View 模型中所做的:

public ICommand RowEditEndingAction
{
get { return new DelegateCommand(RowEditEnding); }
}

public ICommand UpdateDatabaseClick
{
get { return new DelegateCommand<object>(UpdateDatabase); } //THIS LINE HAS THE ERROR
}

以及将被调用的实际方法:

public void UpdateDatabase(object parameter)
{
Window w = (Window)parameter;
// A bunch of stuff that works is removed for brevity
w.Close();
}

编译器不喜欢我的 UpdateDatabaseClick,特别是说 DelegateCommand 的参数有问题,但我不知道我做错了什么(虽然我认为这是语法......)。我需要改变什么?在我将参数添加到 UpdateDatabase 之前,这一切都有效,并且只有 DelegateCommand(没有模板类)。但在那种情况下我无法关闭窗口。

最佳答案

这是您的 DelegateCommand<T> 的构造函数您正在调用的类:

public DelegateCommand(Action action)

这是你如何调用它:

new DelegateCommand<object>(UpdateDatabase)

在那里,UpdateDatabase声明如下:

public void UpdateDatabase(object parameter)

现在,您正在调用的构造函数需要一个 Action .这是一个没有返回值的无参数方法。

但是,您传递的方法只有一个参数。这就是编译器所提示的。

您实际上可能想要做的是接受任何带有一个参数的方法 - 为此,您可以使用类型 Action<T> .因为您的参数应该具有与作为类型参数传递给您的 DelegateCommand<T> 相同的类型类,你可以像这样声明你的构造函数:

public DelegateCommand(Action<T> action)

现在,您还需要更新存储操作的支持字段的类型:

private readonly Action<T> _action;

最后,作为_action现在需要一个参数,您需要在调用时传递该参数 _actionDelegateCommand<T>.Execute .通常,您想交出 parameter您收到的对象作为 Execute 的参数方法。但是,该值始终键入为 object ,而您想使用 T 类型的强类型值在你的方法中。因此,您还必须添加一个额外的类型转换:

public void Execute(object parameter)
{
_action((T)parameter);
}

关于c# - 带参数的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29222069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com