2012-03-21 8 views
0

私はハイパーリンクボタンを持っていました。ログイン成功すれば、コンテンツの背後にあるコードをクリックして新しいビューにします。viewmodelで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つの異なるデータテンプレート、1つはログイン前にデータを提示する、もう1つはログイン後に使用するデータテンプレートです。

これを達成する方法はいくつかあります。私が通常使っているのは、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に「ビューに依存しません」と指示していますが、実際には「コードなし」という意味ではありません。これは、VMがビュー内の何も参照できないことを意味します。このように通信すると、ビューイベントが発生します(データバインディングはプロパティ変更イベントのラッパーに過ぎません)。したがって、あなたのView ModelでイベントUiRequestを使用し、プロトコルを設計します。 Viewのコンストラクタで、ハンドラを登録します。ハンドラでは、コンテンツを変更します(人々は主にこのイディオムを使用してポップアップウィンドウを開始しますが、どこでも使用できます)。

関連する問題