gpt4 book ai didi

mvvm-light - 为什么不工作 : RelayCommand RaiseCanExecuteChanged

转载 作者:行者123 更新时间:2023-12-01 16:41:51 25 4
gpt4 key购买 nike

当我在 TimerOnElapsed 方法中调用 PressCommand.RaiseCanExecuteChanged(); 时,没有任何反应。

可能是什么问题?(GalaSoft.MvvmLight.WPF4 v4.0.30319 和 GalaSoft.MvvmLight.Extras.WPF4 v4.0.30319)

这是我的测试代码:

using System.Timers;
using System.Windows;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;

namespace CommandTest {


public class MainWindowVM : ViewModelBase {

public MainWindowVM() {

PressCommand = new RelayCommand(
() => MessageBox.Show("Pressed"),
() => _canExecute);

PressCommand.CanExecuteChanged += (sender, args) => System.Diagnostics.Debug.WriteLine(System.DateTime.Now.ToLongTimeString() + " CanExecuteChanged");

_timer = new Timer(1000);
_timer.Elapsed += TimerOnElapsed;
_timer.Enabled = true;
}

public RelayCommand PressCommand { get; private set; }

#region Private

private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs) {
_canExecute = !_canExecute;
PressCommand.RaiseCanExecuteChanged();

System.Diagnostics.Debug.WriteLine("At {0} enabled: {1}", elapsedEventArgs.SignalTime.ToLongTimeString(), _canExecute);
}

private readonly Timer _timer;
private bool _canExecute;

#endregion


}
}

提前致谢

最佳答案

解释:

TimerOnElapsed 方法在工作线程上运行,但要调用 PressCommand.RaiseCanExecuteChanged(); 必须在 UI 线程上。

这就是解决方案,更新后的 TimerOnElapsed 方法:

    private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs) {
_canExecute = !_canExecute;
Application.Current.Dispatcher.Invoke(PressCommand.RaiseCanExecuteChanged);
System.Diagnostics.Debug.WriteLine("At {0} enabled: {1}", elapsedEventArgs.SignalTime.ToLongTimeString(), _canExecute);
}

关于mvvm-light - 为什么不工作 : RelayCommand RaiseCanExecuteChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12876324/

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