为什么不工作:RelayCommand RaiseCanExecuteChanged

Osz*_*kar 2 relaycommand mvvm-light

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

可能是什么问题呢?(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


}
}
Run Code Online (Sandbox Code Playgroud)

先感谢您

Osz*_*kar 6

说明:

TimerOnElapsed方法在Worker Thread上运行,但是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);
    }
Run Code Online (Sandbox Code Playgroud)