我是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仍然没有工作。
我希望你能帮助我(我在没有结果的情况下摸不着头脑。)
答案 0 :(得分:2)
MvvmLight在两个不同的命名空间中提供了两个不同的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以获取更多信息。
答案 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); }
}
}