代码之家  ›  专栏  ›  技术社区  ›  michasaucer

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

  •  0
  • michasaucer  · 技术社区  · 7 年前

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

    首先,我的

    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
    }
    }
    

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

    谢谢你的建议!

    1 回复  |  直到 7 年前
        1
  •  1
  •   Anu Viswan    7 年前

    为此,您可以使用EventAggregator。

    “事件聚合器是一种提供发布功能的服务 以松散方式从一个实体到另一个实体的对象。"

    对于LoginView模型,

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

    和MainWindowViewModel,

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

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

    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();
       }
     }
    

    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