2012-03-21 3 views
0

에서 XAML 내용을 설정할 수 있습니다.는 어떻게 내가 로그인 성공하면 새로운보기로 내용 뒤에 코드에서 버튼 클릭으로 설정 하이퍼 링크 버튼을 했어 뷰 모델

private void OkButtonClick(object sender, RoutedEventArgs e) 
    { 
     LoginOperation loginOp = FLS.Utilities.RIAWebContext.Current.Authentication.Login(
      new LoginParameters(usernameTextBox.Text, passwordTextBox.Text)); 
     loginOp.Completed += (s2, e2) => 
     { 
      if (loginOp.HasError) 
      { 
       errorTextBlock.Text = loginOp.Error.Message; 
       loginOp.MarkErrorAsHandled(); 
       return; 
      } 
      else if (!loginOp.LoginSuccess) 
      { 
       errorTextBlock.Text = "Login failed."; 
       return; 
      } 
      else 
      { 
       errorTextBlock.Text = string.Empty; 
       Content = new WelcomeView(); 

      } 
     }; 
    } 

이제 뷰 모델에서 MVVM 코드를 옮기고 하이퍼 링크 버튼에 delegateCommand를 사용했습니다.

<UserControl ... > 
<Grid ... > 
... 
<HyperlinkButton Content="Login" Height="23" HorizontalAlignment="Left" Margin="313,265,0,0" Name="loginButton" Command="{Binding Path=LoginCommand}" VerticalAlignment="Top" Width="75"/> 
... 
</Grid> 
</UserControl> 

그러나 나는 어떻게 Content = new WelcomeView()를 만들지 모르겠다. 뷰 모델의 코드 뒤에 있습니까?

답변

0

좋은 디자인 패턴은 하나의 로그인 전에 데이터를 제공하기 위해 두 개의 다른 데이터 템플릿을하는 것, 및 제 2 데이터 템플릿은 로그인 후에 사용한다.

달성 방법에는 여러 가지가 있습니다. 필자가 일반적으로 사용하는 것은 ViewModel (직접 바인딩 사용)을 Window의 하위 노드에 배치하기 만하면됩니다.

ViewModel에서 콘텐츠 선택기 클래스를 구현하십시오. DataTemplateSelector에서 파생 된 클래스이며 FindResource API를 사용하여 적절한 데이터 템플릿을 가져옵니다.

<Window ...> 
    <Window.Resources> 
     <DataTemplate x:key="beforeLogin"> 
      ... 
     </DataTemplate> 
     <DataTemplate x:Key="afterLogin"> 
      ... 
     </DataTemplate>    
    </Window.Resources> 

    <Window.ContentTemplateSelector> 
     <code:MyTemplateSelector /> 
    </Window.ContentTemplateSelector> 

    <-- Here is the content of Window. It's the view model (data). The View will be 
     bind by the TemplateSelector 
    <code:YourViewModel /> 

</Window> 

관련 예제는 http://msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol.contenttemplateselector.aspx을 확인하십시오.

다른 디자인 패턴이 있습니다. 또 다른 공통 관용구는 단순히 "UiRequest"이벤트를 시작하는 것으로, 뷰의 코드 숨김에 의해 선택됩니다. MVVM은 ViewModel이 "view agnostic"이라는 것을 명심하지만 실제로 "뒤에 코드 없음"을 의미하지는 않습니다. 이것은 VM이 뷰에서 아무 것도 참조 할 수 없음을 의미합니다. 이런 식으로 통신하면 뷰 이벤트가 발생합니다 (예 : 데이터 바인딩은 속성이 변경된 이벤트 주위의 래퍼 일뿐입니다). 따라서 View Model에서 이벤트 UiRequest를 사용하고 프로토콜을 디자인하십시오. View의 생성자에서 핸들러를 등록하십시오. 핸들러에서 내용을 변경하십시오 (사람들은이 관용구를 주로 사용하여 팝업 창을 시작하지만 어디에서나 사용할 수 있습니다).