gpt4 book ai didi

c# - wpf 中的自定义命令

转载 作者:太空狗 更新时间:2023-10-30 01:10:07 24 4
gpt4 key购买 nike

我正在开发一个 WPF 应用程序,它有一个工具栏/菜单,可用于多个自定义命令。大概在 15-20 左右。我看过有关如何创建自定义命令的文档,但它们不一定适用于我正在尝试做的事情。

我正在使用 Controller 来处理我应用程序中的业务逻辑,并且我试图让我的 View 完全不执行任何逻辑。

我想做的是在我的项目中创建一个目录来保存自定义命令类,这样我就可以将它们与 Controller 和 View 分离,但我仍然希望它们可以从 View 中调用,例如正常命令是。

我也看到了 DelegateCommand 类的使用,但不太确定这是否是我想要进入的方向。

我希望能够有一个任意的自定义命令类,如下所示

public CustomCommand: ICommandd
{
public bool CanExecute(object parameter)
{
//arbitrary logic
}

public void Execute(object parameter)
{

}
}

我的想法是我有 10-20 个这样的东西,我想让它们与其他东西分开,并在需要时调用它们。

我知道有一种方法可以分离我的自定义命令,但不太确定。

我不熟悉使用命令,所以我仍在努力掌握这个概念。

谢谢,

最佳答案

概念是您将命令绑定(bind)到按钮,该命令驱动该按钮的两个属性:“单击时”和“启用”,从而生成您发布的界面。

您想要执行命令的主要原因是能够将按钮点击绑定(bind)到 View 模型中的操作。

如果您创建一个将操作作为构造函数参数的自定义命令,您可以将 View 模型中的方法直接连接到您的命令。

public class RelayCommand: ICommandd
{
Action action;
Func<bool> canExecute;

public RelayCommand(Action action) : this(action, () => true) {}
public RelayCommand(Action action, Func<bool> canExecute)
{
this.action = action;
this.canExecute = canExecute;
}

public bool CanExecute(object parameter)
{
return canExecute();
}

public void Execute(object parameter)
{
action();
}
}

在你的 View 模型中的用法是

public RelayCommand SaveCommand { get; set; }

SaveCommand = new RelayCommand(OnSave);

public void Save()
{
// save logic...
}

如果你想连接 CanExecute,你也可以使用第二个 ctor 并提供一个 CanSave 方法。

public RelayCommand SaveCommand { get; set; }

SaveCommand = new RelayCommand(OnSave, CanSave);

public void Save()
{
// save logic...
}

public bool CanSave()
{
return // ...
}

您可能已经注意到,我在实现中删除了命令参数。这在大多数情况下就足够了,并且可以在您的处理程序方法中节省额外的参数。对于剩下的 10%,我实现了一个 RelayCommand<T>它采用 Action 而不是 Action 并更改 Execute方法

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

这需要一个参数化处理程序

SaveCommand = new RelayCommand<SomeType>(OnSave);

public void Save(SomeType toSave)
{
// save logic using parameter
}

这可以避免您在使用 object 时遇到的所有转换问题变量并确保您的 View 模型类型安全。

关于c# - wpf 中的自定义命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5362609/

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