Получить информацию из другого окна в Caliburn.Micro, WPF, MVVM - PullRequest
0 голосов
/ 08 декабря 2018

Я создаю окно входа в свое приложение на основе фреймворка Caliburn.Micro.Итак, как вернуть свойство (например, true, если пользователь передал хорошие данные, или false, если он передал неверные учетные данные) из метода TryClose() из моего окна входа в систему, которое инициализируется Caliburn.Micro?Как получить информацию из окна, открытого в 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...
    }

}

My 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 Ответ

0 голосов
/ 09 декабря 2018

Вы можете использовать EventAggregator для этой цели.

"Агрегатор событий - это служба, которая предоставляет возможность публикации объекта от одного объекта к другому свободно основанным способом."

Первым шагом будетсоздайте экземпляр EventAggregator в ваших ViewModels и подпишитесь на него.Вы можете сделать это через DI в конструкторе обеих ViewModels.

Для 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);
}

Следующим шагом является создание сообщения.Объект, который может передавать необходимую информацию между ViewModels.

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

Наконец, пришло время собрать все воедино.В методе youg LoginButton в LoginViewModel мы модифицируем код, чтобы вызвать событие при успешном входе в систему.

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)

...