2012-12-02 4 views
0

Caliburn Micro를 사용 중이고 시작시 표시되는 로그인보기 모델이 있습니다.로그인 대화 상자에 Caliburn Micro와의 성공적인 연결을위한 기본 양식을 표시하십시오.

저는 서버에 대한 모든 연결을 처리하고 ViewModel에 간단한 콜백 이벤트를 제공하는 별도의 클래스를 사용하고 있습니다. 이것이 ITransportClient입니다.

사용자가 자격 증명을 입력하고 로그인을 누르면 대화 상자에 여러 상태 (연결, 사용자 이름 유효성 검사, 구성 다운로드)가 표시됩니다. 백그라운드에서 Login ViewModel은 ITransportClient.Login()을 호출합니다.

OK로 로그인하고 모든 단계를 완료하면 양식이 닫히고 주 창 ViewModel이 열립니다. 자격 증명이 잘못되었거나 설정을 다운로드하는 데 문제가 있으면 오류가 표시되고 로그인 양식이 남아 있어야합니다.

서버에 연결이 끊어지면 (ITransportClient 이벤트로 표시됨) 응용 프로그램이 여러 번 다시 연결을 시도해야하며 서버가 구성 가능한 시간 동안 오프라인 상태이면 로그인 창이 다시 표시되어야합니다 .

  1. 위의 흐름에 따라 로그인 대화 상자와 기본 창 사이의 전환을 어떻게 처리합니까?
  2. 어떻게 로그인 ViewModel을 닫을 수 있습니까? 은 ShowDialog, ShowPopupShowWindow 개의 메소드 만 포함하고 있습니까?
  3. 로그인 창을 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); 
     } 
    } 
} 

답변

1

CM은 CM이 이해할 수있는 창 관리를위한 계약을 제공하기 위해 IWindowManager 인터페이스를 사용합니다. 구현 자체는 UI와 관련된 것입니다 (예 : Telerik 컨트롤 대 Microsoft 표준 컨트롤 = 다릅니다. IWindowManagerWindowManager으로 CM에서 구현이 관리자라는 하위 클래스를 포함 WindowConductor 그 작업 Window 컨트롤 자체에서 이벤트를 처리하고

테이크 (뷰 모델과 뷰 컨테이너 사이의 접착제를) 창에 호출을 전달하는 것입니다 보고는 :

http://caliburnmicro.codeplex.com/SourceControl/changeset/view/35f41b2f9113#src%2fCaliburn.Micro.Silverlight%2fWindowManager.cs

이 도체는 당신을위한 창을 관리 - 당신이 구현 보면, 당신은 같은 IActivate, IDeactivateIGuardClose 같은 특정 인터페이스의 존재를 확인 볼 수 있습니다. 이러한 인터페이스를 구현하면 윈도우의 라이프 사이클 기능이 향상됩니다.Screen 대신 PropertyChangedBase에서 상속

당신은 또한 자동보기 캐싱 및 뷰는 일단

에 대한 참조를 얻기위한 유용한 방법을 제공 IViewAware의 구현을 얻을, 무료로이 인터페이스의 구현을 얻을 수있는 방법 중 하나입니다 이 클래스에서 상속되거나 인터페이스가 구현되면 메서드를 호출하여 VM을 통해 윈도우를 닫을 수 있습니다 (예 : TryClose). WindowConductor은 윈도우 컨트롤에 필요한 호출을 전달합니다. 닫는 작업을 취소 할 수있는 IGuardClose 인터페이스를 사용하여 윈도우가 닫히는 것을 방지 할 수도 있습니다.

VM에 로그인 방법이있는 것 같아서 이미 CM에서 Actions에 대한 핸들이 있다고 가정합니다.

이제 답을 묻는 질문입니다. 팝업 창 경로를 이동해야합니까? Conductor<T>.Collections.OneActive에서 상속받을 수 있으며 ActivateItem(yourViewModel) (TIScreen 일 수 있음)으로 전화하십시오. 새 항목이 활성화되면 로그인 viewmodel이 자동으로 비활성화됩니다. 또는 로그인 실패 viewmodel이나 그 ilk 중 어떤 것을 열 수 있습니다.

:이 별도의 창을 사용하지 않는 동안, 구현은

자세한 여기를보세요 (단순 MDI 섹션을보고 주변)가 ViewModel에 당신의 도체에 ActiveItemContentControl을 결합, 매우 간단합니다

http://caliburnmicro.codeplex.com/wikipage?title=Screens%2c%20Conductors%20and%20Composition&referringTitle=Documentation

관련 문제