我正在尝试将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中效果很好,而CurrentView
是string
上的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
都会继承BindableBase
到ViewModelBase
,因此所有OnPropertyChanged
内容也应该正常工作(所有其他属性都是工作正常)。
无论如何,我知道CurrentView
正在改变,但ChangePropertyAction
行为没有被触发。有什么我想念的吗?
答案 0 :(得分:3)
我假设-1
可以使用已编译的绑定ContentControl
,因为设计人员认识到与AutoComplete的绑定。
我将其更改为使用常规绑定{x:Bind ViewModel.CurrentView}
后,触发器开始正常工作。这是工作版本:
{Binding CurrentView}