Wpf 在执行另一个命令后启用/禁用命令

Wpf 在执行另一个命令后启用/禁用命令,wpf,command,Wpf,Command,这里有一个技巧性的问题。在调用另一个命令后,我有许多命令应该启用/禁用。例如,我有打开、保存和启动命令。只有在成功执行Open命令后,才能启用Save和Start命令。调用Start命令后,必须禁用“打开”和“保存”命令。对于这种情况,最佳做法是什么?每个ICommand实例都有一个boolCanExecute元素。答案是把你的逻辑放在这些元素中。我使用了一种类型的RelayCommand,因为我使用的是MVVM,但这与此问题无关。。。重要的是bool参数,它指定命令是否可以执行。我会这样做:

这里有一个技巧性的问题。在调用另一个命令后,我有许多命令应该启用/禁用。例如,我有打开、保存和启动命令。只有在成功执行Open命令后,才能启用Save和Start命令。调用Start命令后,必须禁用“打开”和“保存”命令。对于这种情况,最佳做法是什么?

每个
ICommand
实例都有一个bool
CanExecute
元素。答案是把你的逻辑放在这些元素中。我使用了一种类型的
RelayCommand
,因为我使用的是MVVM,但这与此问题无关。。。重要的是bool参数,它指定
命令
是否可以执行。我会这样做:

private bool isOpen, hasStarted;

public ICommand Open
{
    get { return new ActionCommand(action => OpenCommand(), canExecute => 
        !hasStarted); }
}

private void OpenCommand()
{
    // do your stuff here
    isOpen = true;
}

public ICommand Save
{
    get { return new ActionCommand(action => SaveCommand(), canExecute => 
        isOpen && !hasStarted); }
}

private void SaveCommand()
{
    // do your stuff here
}

public ICommand Start
{
    get { return new ActionCommand(action => AudioTrack.RevertState(), canExecute => 
        isOpen); }
}

private void StartCommand()
{
    // do your stuff here
    hasStarted = true;
}

显然,您需要在某个阶段再次将
hastarted
isOpen
变量设置为false,以重新启用该功能。

在Prism中,有一个名为“CompositeCommand”的类,它是专为这类事情设计的。但如果您不使用Prism,您可以阅读此命令上的文档并实现类似的功能。你真的是指方法吗?你说的“诡计问题”是什么意思?@Blam,我猜“命令”是指“命令”,而“诡计”是指“诡计”。:)@谢里登:那么你的回答是sense@Blam,如果L.E.O.能回来看看他问的问题,也许我们会发现。)是的,我已经找到了CanExecute方法的用途,问题是,这个方法只有在触发CanExecuteChanged事件时才被调用。这就是我遇到麻烦的地方。我需要在执行一个命令后,在多个命令上触发该事件。我知道这是一个CommandManager.InvalidateRequestSuggested方法,但它有点太慢了,可能是因为它重新查询了所有命令(其中有很多命令)。