2016-04-19 26 views
2

を複数のUserControlに分割して、特定の値に応じて適切なViewを表示しようとしています。UWPでDataTriggerBehaviorを使用してContentTemplateを変更する

私はこのようなWPFでこれを実現:

<Window.Resources> 
    <DataTemplate x:Key="CardView"> 
     <views:CardView /> 
    </DataTemplate> 
    <DataTemplate x:Key="OtherView"> 
     <views:OtherView /> 
    </DataTemplate> 
    <DataTemplate x:Key="MainView"> 
     <views:MainView /> 
    </DataTemplate> 
</Window.Resources> 

... 

<ContentControl Content="{Binding}"> 
    <ContentControl.Style> 
     <Style TargetType="{x:Type ContentControl}"> 
      <Setter Property="ContentTemplate" Value="{StaticResource MainView}" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding CurrentView}" Value="Other"> 
        <Setter Property="ContentTemplate" Value="{StaticResource OtherView}" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding CurrentView}" Value="Card"> 
        <Setter Property="ContentTemplate" Value="{StaticResource CardView}" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding CurrentView}" Value="Main"> 
        <Setter Property="ContentTemplate" Value="{StaticResource MainView}" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 

これは、WPFで素晴らしい作品、そしてCurrentViewButtonプレスの/ etc経由で変更されViewModelstringプロパティです。

UWPにはDataTrigger sが存在しないので、私はあなたの代わりにDataTriggerBehavior Sを使用して同じことを達成できることを読みました。

<Page.Resources> 
    <DataTemplate x:Key="PaymentView"> 
     <local:PaymentView /> 
    </DataTemplate> 
    <DataTemplate x:Key="InvoiceView"> 
     <local:InvoiceView /> 
    </DataTemplate> 
</Page.Resources> 

... 

<ContentControl Content="{Binding}" 
       ContentTemplate="{StaticResource InvoiceView}" 
       RelativePanel.AlignLeftWithPanel="True" 
       RelativePanel.AlignRightWithPanel="True" 
       RelativePanel.Below="PageHeader"> 
    <interactivity:Interaction.Behaviors> 
     <core:DataTriggerBehavior Binding="{x:Bind ViewModel.CurrentView}" Value="Invoice"> 
      <core:ChangePropertyAction PropertyName="ContentTemplate" Value="{StaticResource InvoiceView}" /> 
     </core:DataTriggerBehavior> 
     <core:DataTriggerBehavior Binding="{x:Bind ViewModel.CurrentView}" Value="Payment"> 
      <core:ChangePropertyAction PropertyName="ContentTemplate" Value="{StaticResource PaymentView}" /> 
     </core:DataTriggerBehavior> 
    </interactivity:Interaction.Behaviors> 
</ContentControl> 

しかし、いくつかの理由で

ChangePropertyActionが発射されていません。だから私はこれを試してみました。私はそれにブレークポイントを設定したので、 CurrentViewが変更されていることを知っています。私はTemplate10を使用しています

private string _currentView; 
public string CurrentView 
{ 
    get { return _currentView; } 
    set { Set(ref _currentView, value); } 
} 

ので、すべての私のViewModel秒のViewModelBaseBindableBaseを継承するので、すべてのOnPropertyChangedものも適切に動作する必要があります(他のすべてのプロパティが正常に動作している):念のため、ここではプロパティです。

とにかく、が変更されていますが、ChangePropertyActionの動作は発生していません。私は行方不明のものがありますか?

+0

ViewModelオブジェクトはContentControlのDataContextの下にありますか? – Archana

+0

私はそれを継承したと仮定しました。私は '{Bind ViewModel.CurrentView}'というコンパイルされたバインディングの代わりに 'Binding'を{Binding CurrentView}に変更してしまいました。私はすでにそれを試みたと思ったが、明らかにそうではなかった。ありがとう。 –

答えて

3

ContentControlは、コンパイル済みのバインド{x:Bind ViewModel.CurrentView}を使用していると想定していました。これは、設計者がAutoCompleteでそのバインディングを認識したためです。

通常バインディング{Binding CurrentView}を使用するように変更すると、トリガーが正常に機能し始めました。

<Page.Resources> 
    <DataTemplate x:Key="PaymentView"> 
     <local:PaymentView /> 
    </DataTemplate> 
    <DataTemplate x:Key="InvoiceView"> 
     <local:InvoiceView /> 
    </DataTemplate> 
</Page.Resources> 

... 

<ContentControl Content="{Binding}" 
       ContentTemplate="{StaticResource InvoiceView}" 
       RelativePanel.AlignLeftWithPanel="True" 
       RelativePanel.AlignRightWithPanel="True" 
       RelativePanel.Below="PageHeader"> 
    <interactivity:Interaction.Behaviors> 
     <core:DataTriggerBehavior Binding="{Binding CurrentView}" Value="Invoice"> 
      <core:ChangePropertyAction PropertyName="ContentTemplate" Value="{StaticResource InvoiceView}" /> 
     </core:DataTriggerBehavior> 
     <core:DataTriggerBehavior Binding="{Binding CurrentView}" Value="Payment"> 
      <core:ChangePropertyAction PropertyName="ContentTemplate" Value="{StaticResource PaymentView}" /> 
     </core:DataTriggerBehavior> 
    </interactivity:Interaction.Behaviors> 
</ContentControl> 
+0

私は1時間かそこらで働いていなかった理由を理解しようとする前に、これを見つけました。 – schnitty

関連する問題