RelayCommand未刷新执行/ canexecute更改

时间:2017-01-30 15:20:53

标签: c# wpf mvvm

我是mvvm的新手(当然还有mvvlight)。我有3个模型视图(MainWindow有一个容器,另有2个模型视图(Login和Menu))。在LoginModelView中,当用户登录成功时,调用MenuViewModel(使用Messenger.Default)更改MainWindow容器中的页面。一切都没问题,然后我调用一个Message.Default.Send将一个对象从LoginModelView发送到正确监听的MenuModelView,捕获关联的对象并执行相关的方法(ConfiguraMenu)定义一个RelayCommand(逐行检查)方法执行没有任何异常)但问题是这个RelayCommand无法工作,直到我回到LoginViewModel并再次登录。我尝试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仍然没有工作。

我希望你能帮助我(我在没有结果的情况下摸不着头脑。)

2 个答案:

答案 0 :(得分:2)

MvvmLight在两个不同的命名空间中提供了两个不同的RelayCommand类:

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

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

MVVMLight中存在一个错误,导致无效CanExecute()行为。他们使用MVVMLight V5.0.2中的新.CommandWpf命名空间修复它。

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

答案 1 :(得分:0)

您尝试将CanExecute绑定到属性。

所以我的猜测是你没有在这个属性中使用RaisePropertie Changed。 你必须有类似的东西:

        public class MenuModel : ViewModelBase
        {
            // Other pieces of code....

            private bool _sw_reportes;
            public bool Sw_reportes
            {
                get { return _sw_reportes; }
                set { _sw_reportes = value; 
                       RaisePropertyChanged(() => Sw_reportes); }
            }
        }