gpt4 book ai didi

c# - 中继命令上的 CanExecute 不起作用

转载 作者:行者123 更新时间:2023-12-03 10:36:48 27 4
gpt4 key购买 nike

我有一个带有按钮的简单程序,该按钮绑定(bind)到 View 模型中的 Relaycommand,如下所示。我根据某个值将 CanExecute 设置为 true(由计时器设置,您可以在下面找到详细信息)。当 Status 为时,我的按钮已启用3,最初我在构造函数中设置它。但是当状态值自己更改时它不会被禁用。我可以看到只有当我点击它时才会禁用。任何人都可以解释为什么它不会自行禁用

public class MainWindowViewModel : INotifyPropertyChanged
{

private RelayCommand mClickButtonCommand;
private int mStatus;
private Timer mTimer;


public MainWindowViewModel()
{
Status = 3;

mTimer = new Timer(1000);
mTimer.Elapsed += OnElapsed;
mTimer.Start();
}

private void OnElapsed(object sender, ElapsedEventArgs e)
{
if (Status == 5)
{
Status = 0;
}
Status++;
}

public ICommand ClickButtonCommand
{
get
{
if (mClickButtonCommand == null)
{
mClickButtonCommand = new RelayCommand(OnClick, () => CanClick);
}
return mClickButtonCommand;
}
}

private void OnClick()
{
Console.WriteLine("Clicked");
}

public bool CanClick
{
get { return Status == 3; }
}

public int Status
{
get { return mStatus; }
set
{
mStatus = value;
OnPropertyChanged("Status");
OnPropertyChanged("CanClick");
}
}

public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}

我真正的命令实现是
 public class RelayCommand : ICommand
{



public RelayCommand(Action execute)
: this(execute, null)
{
}
public RelayCommand(Action execute, Func<bool> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");

_execute = execute;
_canExecute = canExecute;
}

#region ICommand Members

[DebuggerStepThrough]
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute();
}

public event EventHandler CanExecuteChanged
{
add
{
if (_canExecute != null)
CommandManager.RequerySuggested += value;
}
remove
{
if (_canExecute != null)
CommandManager.RequerySuggested -= value;
}
}

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

#endregion // ICommand Members

#region Fields

readonly Action _execute;
readonly Func<bool> _canExecute;

#endregion // Fields
}

最佳答案

感谢您的输入,我通过在我的中继命令实现中添加 CommandManager.InvalidateRequerySuggested 解决了我的问题。

[DebuggerStepThrough]
public bool CanExecute(object parameter)
{
bool result = true;

if (_canExecute != null)
{
result = _canExecute();
CommandManager.InvalidateRequerySuggested();
}
return result;
}

关于c# - 中继命令上的 CanExecute 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24119185/

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