Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RelayCommand未刷新执行/canexecute更改_C#_Wpf_Mvvm - Fatal编程技术网

C# RelayCommand未刷新执行/canexecute更改

C# RelayCommand未刷新执行/canexecute更改,c#,wpf,mvvm,C#,Wpf,Mvvm,我是mvvm的新手(当然还有mvvlight)。我有3个模型视图(一个主窗口有一个容器,另外2个模型视图(登录和菜单))。在LoginModelView中,当用户成功登录时,将调用MenuViewModel(使用Messenger.Default)更改MainWindow容器中的页面。在此之前一切正常,然后我调用Message.Default.Send将对象从LoginModelView发送到正确侦听的MenuModelView,捕获关联的对象并执行关联的方法(ConfiguralMenu),该

我是mvvm的新手(当然还有mvvlight)。我有3个模型视图(一个主窗口有一个容器,另外2个模型视图(登录和菜单))。在LoginModelView中,当用户成功登录时,将调用MenuViewModel(使用Messenger.Default)更改MainWindow容器中的页面。在此之前一切正常,然后我调用Message.Default.Send将对象从LoginModelView发送到正确侦听的MenuModelView,捕获关联的对象并执行关联的方法(ConfiguralMenu),该方法定义了RelayCommand(逐行检查,该方法无任何异常地执行)但问题是,在我返回LoginView模型并再次登录之前,此RelayCommand不起作用。我尝试CommandManager.InvalidateRequestSuggested()并且也不起作用

这是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);
            }
        }
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();
        }
此代码用于MenuViewModel:

//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);
            }
        }
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();
        }
public RelayCommand abreexeclasecomand{get;private set;}
公共菜单视图模型()
{
Register(this,usuario_recibido=>{Miusuario=usuario_recibido;ConfiguraMenu();});
}
私有菜单(){
Mimenu=新菜单模型(Miusuario);
AbreExeClaseCommand=newrelaycommand(()=>{Messenger.Default.Send(newmovetoviewmessage(Page.NeverReachedView));},()=>Mimenu.Sw_报告);
CommandManager.InvalidateRequestSuggested();
abreexeclascommand.raisecannexecutechanged();
}
我尝试将CanExecute硬编码为true,但在返回并再次登录之前,执行仍然没有工作


我希望您能帮助我(我搔了好几天的头,都没有结果)。

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

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

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


您还可以签出并获取更多信息。

您尝试将CanExecute绑定到属性

所以我猜你没有在这个属性中使用RaiseProperty 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); }
            }
        }