我是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 post和the change log以获取更多信息。
关于c# - RelayCommand不刷新执行/无法执行更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41939411/