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?
Ist Viewmodel-Objekt unter dem DataContext von ContentControl? – Archana
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. –