2016-04-19 11 views
2

Ich versuche, meine View in mehrere UserControl s zu trennen und dann die entsprechenden View abhängig von einem bestimmten Wert anzuzeigen.Ändern von ContentTemplate mit DataTriggerBehavior in UWP

ich erreichen dies in WPF wie folgt aus:

<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> 

Dies funktioniert gut in WPF, und die CurrentView ist ein string Eigenschaft auf dem ViewModel, die über Button Pressen/etc geändert wird.

Da es keine DataTrigger s in UWP gibt, habe ich gelesen, dass Sie die gleiche Sache mit DataTriggerBehavior s stattdessen erreichen können. Also habe ich versucht, dies:

<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> 

Aber aus irgendeinem Grund, die ChangePropertyAction feuert nicht. Ich weiß, dass sich die CurrentView ändert, da ich einen Haltepunkt darauf gesetzt habe. Nur für den Fall, hier ist die Eigenschaft:

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

ich Template10 verwende, so alle meine ViewModel s erben BindableBase durch ViewModelBase, so dass alle die OnPropertyChanged Sachen sollten auch richtig arbeiten (alle anderen Eigenschaften arbeiten gut) .

Wie auch immer, ich weiß, dass die CurrentView ändert sich, aber die ChangePropertyAction Verhalten wird nicht ausgelöst. Gibt es etwas, das mir fehlt?

+0

Ist Viewmodel-Objekt unter dem DataContext von ContentControl? – Archana

+0

Ich nahm an, dass es es geerbt hat. Am Ende änderte ich die 'Binding' in' {Binding CurrentView} 'anstelle der kompilierten Bindung' {x: Bind ViewModel.CurrentView} 'und jetzt funktioniert es. Ich dachte, ich hätte das schon versucht, aber anscheinend nicht. Vielen Dank. –

Antwort

3

Ich hatte angenommen, dass die ContentControl mit der kompilierten Bindung {x:Bind ViewModel.CurrentView} funktionieren würde, weil der Designer diese Bindung mit AutoComplete erkannt hat.

Sobald ich es geändert, um reguläre Bindung {Binding CurrentView} zu verwenden, dann begann der Trigger ordnungsgemäß zu funktionieren. Hier ist die Arbeitsversion:

<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

Ich wünschte, ich hätte das gefunden, bevor ich eine Stunde oder so verbrachte und versuchte herauszufinden, warum es nicht funktionierte. – schnitty