を複数の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で素晴らしい作品、そしてCurrentView
はButton
プレスの/ etc経由で変更されViewModel
にstring
プロパティです。
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
秒のViewModelBase
てBindableBase
を継承するので、すべてのOnPropertyChanged
ものも適切に動作する必要があります(他のすべてのプロパティが正常に動作している):念のため、ここではプロパティです。
とにかく、が変更されていますが、ChangePropertyAction
の動作は発生していません。私は行方不明のものがありますか?
ViewModelオブジェクトはContentControlのDataContextの下にありますか? – Archana
私はそれを継承したと仮定しました。私は '{Bind ViewModel.CurrentView}'というコンパイルされたバインディングの代わりに 'Binding'を{Binding CurrentView}に変更してしまいました。私はすでにそれを試みたと思ったが、明らかにそうではなかった。ありがとう。 –