从Caliburn.Micro,WPF,MVVM中的另一个窗口获取信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Caliburn.Micro,WPF,MVVM中的另一个窗口获取信息相关的知识,希望对你有一定的参考价值。

我在我的应用程序中基于Caliburn.Micro mvvm框架制作登录窗口。那么,如何从我的登录窗口(由Caliburn.Micro初始化)中的true方法返回属性(例如,如果用户传递了良好的数据或false,如果他传递了错误的凭据,则为TryClose())?如何从IWindowManager.ShowDialog()开启的窗口获取信息?

首先,我的MainWindowViewModel.cs:

using Caliburn.Micro;

namespace TaskManager.ViewModels
{
    class MainWindowViewModel : Conductor<IScreen>.Collection.OneActive
    {
        protected override void OnViewLoaded(object view)
        {
            IWindowManager manager = new WindowManager();
            //Login page, context is data with user's lists
            LoginViewModel loginView = new LoginViewModel(context);
            manager.ShowDialog(loginView, null, null);
            //here i want to get info, if i get logged properly or not
        }

        public void LoadUserInfoPage() //here starts "main" program
        {
            ActivateItem(new UserInfoViewModel());
        }
        //and so on...
    }

}

我的LoginViewModel.cs:

namespace TaskManager.ViewModels
{
class LoginViewModel : Screen
{
    public string Login    { get; set; }
    public string Password { get; set; }

    public LoginViewModel(FakeData context)
    {
        this.context = context;
    }

    public void LoginButton()
    {
        bool check = Services.Login.IsValid(Login, Password, context);
        if(check) //if login is OK, check == true
            TryClose();
    }

    private FakeData context { get; set; } //data is here
}
}

然后,我的IsValid()方法:

namespace TaskManager.Services
{
static class Login
{
    static public bool IsValid(string login, string password, FakeData context) 
        => context.users.Any(i => i.Login == login);
        //i know it is bad, but its only example
}
}

按钮,打开和关闭窗口效果很好(也可以从文本框中读取)。如果用户传递了良好的数据,我只想获取信息(可能通过引用?)

谢谢你的意见!

答案

您可以使用EventAggregator来实现此目的。

“Event Aggregator是一种服务,它提供了以松散的方式将对象从一个实体发布到另一个实体的能力。”

第一步是在ViewModel中创建EventAggregator实例并订阅它。您可以通过两个ViewModels的构造函数中的DI来完成。

对于LoginViewModel,

private IEventAggregator _eventAggregator;
public LoginViewModel(FakeData context,IEventAggregator eventAggregator)
{
    _eventAggregator = eventAggregator;
}

和MainWindowViewModel,

private IEventAggregator _eventAggregator;
public MainWindowViewModel (IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.Subscribe(this);
}

下一步是创建一个消息对象,它可以在ViewModel之间传输所需的信息。

public class OnLoginAttemptMessage
{
    string UserName { get; set; }
    bool IsLoginSuccessful { get; set; }
}

最后,是时候把所有东西放在一起了。在LoginViewModel中的youg LoginButton方法中,我们修改代码以在成功登录时引发事件。

public void LoginButton()
{
  bool check = Services.Login.IsValid(Login, Password, context);
  if(check) //if login is OK, check == true
  {
    _eventAggregator.PublishOnUIThread(new OnLoginAttemptMessage
    {
      UserName = Login,
      IsLoginSuccessful = check;
    });
    TryClose();
   }
 }

最后一步是在MainWindowViewModel中,您需要在其中实现IHandle接口。

class MainWindowViewModel : Conductor<IScreen>.Collection.OneActive, IHandle<OnLoginSuccessMessage>
{

        public void Handle(OnLoginSuccessMessage message)
        {
            if(message.IsLoginSuccessful)
            {
                // Login is successfull, do next steps.
            }
        } 
}

你可以在这里阅读有关EventAggregator的更多信息(https://caliburnmicro.com/documentation/event-aggregator

以上是关于从Caliburn.Micro,WPF,MVVM中的另一个窗口获取信息的主要内容,如果未能解决你的问题,请参考以下文章

WPF MVVM(Caliburn.Micro+Metro)-配置Caliburn.Micro

C# WPF MVVM开发框架Caliburn.Micro入门介绍①

C# WPF MVVM开发框架Caliburn.Micro快速搭建③

C# WPF MVVM开发框架Caliburn.Micro常用功能指南②

C# WPF MVVM开发框架Caliburn.Micro自定义引导程序④

关于使用 Caliburn.Micro MVVM WPF 进行视图导航的建议