在UWP中使用DataTriggerBehavior更改ContentTemplate

时间:2016-04-19 00:37:05

标签: c# wpf xaml win-universal-app

我正在尝试将View拆分为多个UserControl,然后根据特定值显示相应的View

我在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中效果很好,而CurrentViewstring上的ViewModel属性,可通过Button按/等进行更改。

由于UWP中没有DataTrigger,我已经读过您可以使用DataTriggerBehavior来完成同样的事情。所以我试过这个:

<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正在改变,因为我已经设置了一个断点。以防万一,这是属性:

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

我正在使用Template10,因此我的所有ViewModel都会继承BindableBaseViewModelBase,因此所有OnPropertyChanged内容也应该正常工作(所有其他属性都是工作正常)。

无论如何,我知道CurrentView正在改变,但ChangePropertyAction行为没有被触发。有什么我想念的吗?

1 个答案:

答案 0 :(得分:3)

我假设-1可以使用已编译的绑定ContentControl,因为设计人员认识到与AutoComplete的绑定。

我将其更改为使用常规绑定{x:Bind ViewModel.CurrentView}后,触发器开始正常工作。这是工作版本:

{Binding CurrentView}