我是mvvm中的newbee(当然是mvvlight)。我有3个modelviews(一个具有容器的MainWindow和另外2个modelviews(登录和菜单))。在LoginModelView中,当用户成功登录时,这将调用MenuViewModel(带有Messenger.Default)来更改MainWindow容器中的页面。在此之前一切都很好,然后我调用Message.Default.Send将一个对象从LoginModelView发送到MenuModelView,该对象已被正确监听,捕获关联的对象并执行定义了RelayCommand的关联方法(ConfiguraMenu)(逐行检查方法被执行,没有任何异常),但问题是直到我回到LoginViewModel并再次登录,此RelayCommand才起作用。我尝试使用CommandManager.InvalidateRequerySuggested(),但也不起作用。

这是LoginViewModel的代码:

//This method is called when the user press the login button. No problem with this
        public void ActionVerificaUsuario()
        {
            Miusuario = db.getUsuario(Txtusuario, Txtpassword);
            if (Miusuario.esUsuario())
            {
                Messenger.Default.Send(new MoveToViewMessage(Page.MenuView));
                Messenger.Default.Send((UsuarioModel)Miusuario);
            }
        }

此代码用于MenuViewModel:
public RelayCommand AbreExeClaseCommand { get; private set; }

     public MenuViewModel()
        {
            Messenger.Default.Register<UsuarioModel>(this, usuario_recibido => {Miusuario = usuario_recibido;ConfiguraMenu(); });

        }

        private void ConfiguraMenu() {
            Mimenu = new MenuModel(Miusuario);
            AbreExeClaseCommand = new RelayCommand(() => { Messenger.Default.Send(new MoveToViewMessage(Page.NeverReachedView)); }, () => Mimenu.Sw_reportes);
            CommandManager.InvalidateRequerySuggested();
            AbreExeClaseCommand.RaiseCanExecuteChanged();
        }

我尝试使用true对CanExecute进行硬编码,但是Execute仍然无法工作,直到返回并再次登录。

希望您能为我提供帮助(我几天来都挠头,没有结果)。

最佳答案

MvvmLight在两个不同的 namespace 中提供了两个不同的RelayCommand类:

  • Galasoft.MvvmLight.Command
  • Galasoft.MvvmLight.CommandWpf

  • 确保在WPF应用程序中使用了正确的命名空间 Galasoft.MvvmLight.CommandWpf

    MVVMLight中存在一个错误,导致CanExecute()行为不正常。他们使用MVVMLight版本V5.0.2中的新.CommandWpf命名空间修复了该问题。

    您也可以查看this GalaSoft blog postthe change log以获取更多信息。

    关于c# - RelayCommand不刷新执行/无法执行更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41939411/

    10-10 20:23