Caliburn Micro를 사용 중이고 시작시 표시되는 로그인보기 모델이 있습니다.로그인 대화 상자에 Caliburn Micro와의 성공적인 연결을위한 기본 양식을 표시하십시오.
저는 서버에 대한 모든 연결을 처리하고 ViewModel에 간단한 콜백 이벤트를 제공하는 별도의 클래스를 사용하고 있습니다. 이것이 ITransportClient입니다.
사용자가 자격 증명을 입력하고 로그인을 누르면 대화 상자에 여러 상태 (연결, 사용자 이름 유효성 검사, 구성 다운로드)가 표시됩니다. 백그라운드에서 Login ViewModel은 ITransportClient.Login()
을 호출합니다.
OK로 로그인하고 모든 단계를 완료하면 양식이 닫히고 주 창 ViewModel이 열립니다. 자격 증명이 잘못되었거나 설정을 다운로드하는 데 문제가 있으면 오류가 표시되고 로그인 양식이 남아 있어야합니다.
서버에 연결이 끊어지면 (ITransportClient 이벤트로 표시됨) 응용 프로그램이 여러 번 다시 연결을 시도해야하며 서버가 구성 가능한 시간 동안 오프라인 상태이면 로그인 창이 다시 표시되어야합니다 .
- 위의 흐름에 따라 로그인 대화 상자와 기본 창 사이의 전환을 어떻게 처리합니까?
- 어떻게 로그인 ViewModel을 닫을 수 있습니까? 은
ShowDialog
,ShowPopup
및ShowWindow
개의 메소드 만 포함하고 있습니까? - 로그인 창을 Login ViewModel 외부에서 닫고 사용자가 기본 창을 로그 아웃 할 때 로그인 창이 표시되도록하려면 위의 내용을 구분하는 가장 좋은 방법은 무엇입니까? 부트 스트랩에서이 작업을 수행해야합니까, 아니면 별도의 ViewModel 쉘을 만들어야합니까?
내 부트 스트 래퍼 :
public class SimpleInjectorBootstrapper : Caliburn.Micro.Bootstrapper
{
private Container container;
protected override void Configure()
{
this.container = new Container();
this.container.Register<IWindowManager, WindowManager>();
this.container.Register<IEventAggregator, EventAggregator>();
this.container.Register<IAppViewModel, AppViewModel>();
this.container.Register<ILoginViewModel, LoginViewModel>();
this.container.RegisterSingle<ITransportClient, Transport.WCF.TransportClient>();
}
protected override object GetInstance(Type serviceType, string key)
{
return this.container.GetInstance(serviceType);
}
protected override IEnumerable<object> GetAllInstances(Type serviceType)
{
return this.container.GetAllInstances(serviceType);
}
protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
{
base.OnStartup(sender, e);
var loginViewModel= this.container.GetInstance<ILoginViewModel>();
var windowManager = this.container.GetInstance<IWindowManager>();
windowManager.ShowWindow(loginViewModel);
}
}
내 LoginView 모델은 다음과 같습니다 :
public class LoginViewModel : PropertyChangedBase, ILoginViewModel
{
private readonly ITransportClient transportClient;
private readonly IWindowManager windowManager;
private string connectionStatus;
public LoginViewModel(ITransportClient transportClient, IWindowManager windowManager)
{
this.transportClient = transportClient;
this.windowManager = windowManager;
this.transportClient.ConnectionEvent += new TransportConnectionEventHandler(UpdateStatusHandler);
}
public void Login()
{
// set from view, to be done via property, implement later
var username = "test";
var password = "test";
var result = this.transportClient.Login(username, password);
// if result is ok, we should close our viewmodel, however we
// cant call IWindowManager.Close(this) as only show methods exist
// perhaps this is better handled elsewhere?
}
public void UpdateStatusHandler(string status)
{
this.ConnectionStatus = status;
}
public string ConnectionStatus
{
get
{
return this.connectionStatus;
}
set
{
this.connectionStatus = value;
NotifyOfPropertyChange(() => ConnectionStatus);
}
}
}