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