如果你想使用触发器来显示UserControl,你应该使用ContentControl而不是ContentPresenter。
我更喜欢将 ContentPresenter 用于自定义控件,当我使用 UserControl 来查看系统中的自定义数据类型的视图时,并允许提供动态行为。
示例:要切换 ContentPresenter 的模板,您需要像这样设置 ContentTemplateSelector
<ContentPresenter Content="{Binding MyContent}"
ContentTemplate="{Binding MyContentTemplate}"
ContentTemplateSelector="{Binding MyContentTemplateSelector}"/>
MyContent、MyContentTemplate 和 MyContentTemplateSelector 是依赖属性,可以在您使用其实例的任何位置进行绑定。
READ :
ContentPresenter 的使用 https://alexfeinberg.wordpress.com/2014/10/11/wpf-the-real-difference-between-contentcontrol-and-contentpresenter/
ContentControl 和 ContentPresenter 有什么区别 https://stackoverflow.com/questions/1287995/whats-the-difference-between-contentcontrol-and-contentpresenter
问题中提到的绑定不起作用
ContentPresenter 的 DataContext 自动设置为以下值
它的 Content 属性,而 ContentControl 的 DataContext 不是。
绑定是相对于 DataContext 属性的值来解析的。如果您在 ContentPresenter 上声明绑定,则在设置其内容时,将重新评估该绑定。
ContentControl.Content 属性可以根据您的要求在任何触发器上进行更改。如果您想使用它来更改 ViewModel 属性的 PropertyChanged 事件,可以通过将其与包含 UserControl 实例的 DataTemplate 绑定或使用该 UserControl 的静态资源来使用 DataTrigger。
<ContentControl>
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Value="{StaticResource UnSelectedDataTemplate}" Property="ContentTemplate" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsSelected}" Value="True">
<Setter Value="{StaticResource SelectedDataTemplate}" Property="ContentTemplate" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentContro.Style>
</ContentControl>
READ 如何使用内容模板的触发器 https://stackoverflow.com/questions/8886453/triggered-content-template, 更多细节here https://alexfeinberg.wordpress.com/2014/10/11/wpf-the-real-difference-between-contentcontrol-and-contentpresenter/
DataTemplate 和 StaticResource 范围的区别在于 DataTemplate 每次应用时都会创建模板的新实例。
而 StaticResource 再次使用 UserControl 的相同实例(静态实例)。
您还可以使用 EventTriggers 来更改基于控制事件(如 MouseOver 等)的内容。
替代方法
与上面非常相似,但略有不同。定义为资源中的数据模板。内容更改的触发本质上是相同的。
...in <x.Resources />
tag:
<DataTemplate x:Key="DesignerTemplate" DataType="{x:Type vm:SolutionViewModel}">
<vw:SolutionDesignerView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:SolutionViewModel}">
<ContentControl Content="{Binding }">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsLoaded}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource DesignerTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
...然后:
<ContentControl Content="{Binding Solution}" />