【问题标题】:How to call another view models constructor in MVVM Light如何在 MVVM Light 中调用另一个视图模型构造函数
【发布时间】:2015-06-05 02:22:11
【问题描述】:

我有一个验证用户登录的方法。如果用户正确登录,我想调用两个视图模型构造函数,以防用户登录。下面是我的示例代码。实现这一目标的最佳方法是什么?

发送视图模型:

        if (UserName == userName && Password == password)
        {
            ProjectManager.Instance.IsAdmin = true;
            isLoggedIn = true;
            IsLoggedIn = true;
            ValidLoginImage();
            LoginStatus = "Admin Logged In";
            MessengerInstance.Send(true);

        }

接收视图模型:

    private void RegisterForMessages()
    {
        MessengerInstance.Register<bool>(this, UpdateEnabled);
    }

    private void UpdateEnabled(bool b)
    {
        IsLoggedIn = b;
    }

registerformessage 方法永远不会被调用。

【问题讨论】:

  • 那你为什么不能只做 ViewModel vm=new ViewModel()?
  • @TheodosiusVonRichthhofen 我试过了,似乎 IsLoggedIn 属性在我正在调用的视图模型上发生了变化,这是一个 IsEnabled 用于该新视图模型的 UI 控件确实设置为正确的状态,即true 但未启用 UI 项。
  • 基本上我正在做的是单击一个视图然后返回另一个视图然后登录我是否也需要调用该视图来刷新?
  • 虽然我不确定你在做什么,但你可以让你的视图模型成为一个静态实例。或使用 MvvmLight Messenger 向更新它的其他视图模型发送消息。 msdn.microsoft.com/en-us/magazine/dn745866.aspx
  • 不知道为什么当视图模型已经存在时你试图调用构造函数......

标签: c# wpf mvvm viewmodel mvvm-light


【解决方案1】:

由于您已经在使用 MvvmLight,我只需发送一条包含布尔值的消息,该布尔值调用视图模型中的方法来更新它。在需要更新的视图模型中注册消息。然后它将等待“确定我已登录”布尔值,然后运行一些方法来更新您的 IsEnabled 属性。把它放在需要更新的视图模型中:

/// <summary>
        /// Listen for messages from other ViewModels
        /// </summary>
        private void RegisterForMessages()
        {
            MessengerInstance.Register<bool>(this, UpdateMyStuff);
        }

private void UpdateMyStuff(bool b)
        {
            IsEnabled=b;
        }

然后在用户登录时发送消息:

//这里登录成功代码...

MessengerInstance.Send(true);  //or your IsLoggedIn property

如果此视图有注销或其他情况,您可以发送 false。

这将使您的视图模型知道用户是否登录的状态,并允许您进行相应的更新。显然,您需要确保实现 INotifyPropertyChanged 等。这已经是 MVVMLight 的一部分。如果你的 viewmodel 实现了 MvvmLight 的 ViewModelBase,它已经为你准备好了。

【讨论】:

  • 太棒了。这就是我一直在寻找的。非常感谢您的耐心等待我真的很感激。
  • 给我一点时间来实施,然后我会将其标记为已回答。
  • 好的,我实现了,但消息注册从未收到消息。
  • 将寄存器放入您的构造函数中,这样当它创建时,它会注册以接收消息。换句话说,RegisterForMessages 必须由您显式调用。在创建视图模型时执行此操作(在构造函数中)
  • 就是这样。再次感谢,我真的很感激。
猜你喜欢
  • 2015-04-04
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
相关资源
最近更新 更多