gpt4 book ai didi

wpf - contentpresenter.content 上的数据触发不起作用

转载 作者:行者123 更新时间:2023-12-01 18:15:02 26 4
gpt4 key购买 nike

我正在尝试基于数据触发器切换 contentpresenter 的内容。我想在 contentpresenter.content 中显示用户控件,如果我设置了值,否则我需要显示错误消息。但是绑定(bind)我的数据触发失败,表明未找到该属性。我无法获取要继承的数据上下文以进行数据触发检查。我可以通过使用注释掉的代码使其工作。但我很困惑为什么它不能按正常方式工作。

  <ContentPresenter.Style>
<Style TargetType="{x:Type ContentPresenter}">
<Setter Property="Content" Value="{Binding UC}"/>
<Style.Triggers>
<!--<DataTrigger Binding="{Binding DataContext.HasValue,RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}" Value="false">
<Setter Property="Content" Value="No preview"/>
</DataTrigger>-->
<DataTrigger Binding="{Binding HasValue}" Value="false">
<Setter Property="Content" Value="No value"/>
</DataTrigger>

</Style.Triggers>

</Style>
</ContentPresenter.Style>
</ContentPresenter>

最佳答案

如果你想使用触发器来显示UserControl,你应该使用ContentControl而不是ContentPresenter。我更喜欢将 ContentPresenter 用于自定义控件,当我使用 UserControl 来查看系统中的自定义数据类型的 View 时,并允许提供动态行为。

示例:要切换 ContentPresenter 的模板,您需要像这样设置 ContentTemplateSelector

<ContentPresenter Content="{Binding MyContent}"
ContentTemplate="{Binding MyContentTemplate}"
ContentTemplateSelector="{Binding MyContentTemplateSelector}"/>

MyContent、MyContentTemplate 和 MyContentTemplateSelector 是依赖属性,可以在您使用其实例的任何位置进行绑定(bind)。

阅读:

Usage of ContentPresenter

What is the difference between ContentControl and ContentPresenter

问题中提到的绑定(bind)将不起作用

ContentPresenter’s DataContext is automatically set to the value of its Content property, while ContentControl’s DataContext is not.

绑定(bind)是相对于 DataContext 属性的值来解析的。如果您在 ContentPresenter 上声明绑定(bind),则在设置其内容时,将重新评估该绑定(bind)。

ContentControl.Content 属性可以根据您的要求在任何触发器上进行更改。如果您想使用它来更改 ViewModel 属性的 PropertyChanged 事件,可以通过将其与包含 UserControl 实例的 DataTemplate 绑定(bind)或使用该 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>

阅读 How to use triggers for content template ,更多详情here

DataTemplate 和 StaticResource 范围的区别在于 DataTemplate 每次应用时都会创建模板的新实例。而 StaticResource 再次使用相同的 UserControl 实例(静态实例)。您还可以使用 EventTriggers 更改基于控制事件(如 MouseOver 等)的内容。

替代方法
与上面非常相似,但略有不同。定义为资源中的数据模板。内容更改的触发本质上是相同的。

...在 <x.Resources />标签:

<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}" />  

关于wpf - contentpresenter.content 上的数据触发不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9359364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com