Wpf 强制重新评估ICommand可在上下文菜单打开时执行

Wpf 强制重新评估ICommand可在上下文菜单打开时执行,wpf,commandbinding,canexecute,Wpf,Commandbinding,Canexecute,我知道我可以在视图模型中强制重新评估CanExecute,但是,这需要视图模型注册到所有相关的数据更改事件,这可能并不总是可行的 由于这些命令仅在上下文菜单中使用,并且在上下文菜单打开期间,无法更改影响CanExecute的数据,因此仅在打开上下文菜单时重新评估CanExecute就足够了 要做到这一点,我可以连接上下文菜单open event并调用view model来调用上下文菜单使用的每个ICommand上的raisecannexectechanged,但这既繁琐又反MVVM。我想知道是否

我知道我可以在视图模型中强制重新评估CanExecute,但是,这需要视图模型注册到所有相关的数据更改事件,这可能并不总是可行的

由于这些命令仅在上下文菜单中使用,并且在上下文菜单打开期间,无法更改影响CanExecute的数据,因此仅在打开上下文菜单时重新评估CanExecute就足够了


要做到这一点,我可以连接上下文菜单open event并调用view model来调用上下文菜单使用的每个ICommand上的raisecannexectechanged,但这既繁琐又反MVVM。我想知道是否有更简单的方法来实现这一点?

是的。使用此ICommand实现。它会重新评估每次交互,在您的例子中是“上下文菜单打开”。它的性能效率不高,但如果您没有数百条命令,则应执行以下操作:

public class Command<TArgs> : ICommand
{
    public Command(Action<TArgs> exDelegate)
    {
        _exDelegate = exDelegate;
    }

    public Command(Action<TArgs> exDelegate, Func<TArgs, bool> canDelegate)
    {
        _exDelegate = exDelegate;
        _canDelegate = canDelegate;
    }

    protected Action<TArgs> _exDelegate;
    protected Func<TArgs, bool> _canDelegate;

    #region ICommand Members

    public bool CanExecute(TArgs parameter)
    {
        if (_canDelegate == null)
            return true;

        return _canDelegate(parameter);
    }

    public void Execute(TArgs parameter)
    {
        if (_exDelegate != null)
        {
            _exDelegate(parameter);
        }
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    bool ICommand.CanExecute(object parameter)
    {
        if (parameter != null)
        {
            var parameterType = parameter.GetType();
            if (parameterType.FullName.Equals("MS.Internal.NamedObject"))
                return false;
        }

        return CanExecute((TArgs)parameter);
    }

    void ICommand.Execute(object parameter)
    {
        Execute((TArgs)parameter);
    }

    #endregion
}
公共类命令:ICommand
{
公共命令(操作exDelegate)
{
_exDelegate=exDelegate;
}
公共命令(操作exDelegate,Func canDelegate)
{
_exDelegate=exDelegate;
_坎德尔盖特=坎德尔盖特;
}
受保护的行动_exDelegate;
受保护的Func_canDelegate;
#区域ICommand成员
公共布尔CanExecute(TArgs参数)
{
如果(_canDelegate==null)
返回true;
返回_canDelegate(参数);
}
public void Execute(TArgs参数)
{
如果(_exDelegate!=null)
{
_exDelegate(参数);
}
}
公共事件事件处理程序CanExecuteChanged
{
添加{CommandManager.RequerySuggested+=value;}
删除{CommandManager.RequerySuggested-=value;}
}
bool ICommand.CanExecute(对象参数)
{
if(参数!=null)
{
var parameterType=parameter.GetType();
if(parameterType.FullName.Equals(“MS.Internal.NamedObject”))
返回false;
}
返回CanExecute((TArgs)参数);
}
void ICommand.Execute(对象参数)
{
执行((TArgs)参数);
}
#端区
}

是的,有。使用此ICommand实现。它会重新评估每次交互,在您的例子中是“上下文菜单打开”。它的性能效率不高,但如果您没有数百条命令,则应执行以下操作:

public class Command<TArgs> : ICommand
{
    public Command(Action<TArgs> exDelegate)
    {
        _exDelegate = exDelegate;
    }

    public Command(Action<TArgs> exDelegate, Func<TArgs, bool> canDelegate)
    {
        _exDelegate = exDelegate;
        _canDelegate = canDelegate;
    }

    protected Action<TArgs> _exDelegate;
    protected Func<TArgs, bool> _canDelegate;

    #region ICommand Members

    public bool CanExecute(TArgs parameter)
    {
        if (_canDelegate == null)
            return true;

        return _canDelegate(parameter);
    }

    public void Execute(TArgs parameter)
    {
        if (_exDelegate != null)
        {
            _exDelegate(parameter);
        }
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    bool ICommand.CanExecute(object parameter)
    {
        if (parameter != null)
        {
            var parameterType = parameter.GetType();
            if (parameterType.FullName.Equals("MS.Internal.NamedObject"))
                return false;
        }

        return CanExecute((TArgs)parameter);
    }

    void ICommand.Execute(object parameter)
    {
        Execute((TArgs)parameter);
    }

    #endregion
}
公共类命令:ICommand
{
公共命令(操作exDelegate)
{
_exDelegate=exDelegate;
}
公共命令(操作exDelegate,Func canDelegate)
{
_exDelegate=exDelegate;
_坎德尔盖特=坎德尔盖特;
}
受保护的行动_exDelegate;
受保护的Func_canDelegate;
#区域ICommand成员
公共布尔CanExecute(TArgs参数)
{
如果(_canDelegate==null)
返回true;
返回_canDelegate(参数);
}
public void Execute(TArgs参数)
{
如果(_exDelegate!=null)
{
_exDelegate(参数);
}
}
公共事件事件处理程序CanExecuteChanged
{
添加{CommandManager.RequerySuggested+=value;}
删除{CommandManager.RequerySuggested-=value;}
}
bool ICommand.CanExecute(对象参数)
{
if(参数!=null)
{
var parameterType=parameter.GetType();
if(parameterType.FullName.Equals(“MS.Internal.NamedObject”))
返回false;
}
返回CanExecute((TArgs)参数);
}
void ICommand.Execute(对象参数)
{
执行((TArgs)参数);
}
#端区
}