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

2024-01-30

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

  <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 来查看系统中的自定义数据类型的视图时,并允许提供动态行为。

示例:要切换 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}" />  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

contentpresenter.content 上的数据触发不起作用 的相关文章

  • DataGrid 是 WPF 中的必需品吗?

    我看到很多讨论正在进行 人们询问 WPF 的 DataGrid 并抱怨 Microsoft 迄今为止还没有在其 WPF 框架中提供 DataGrid 我们知道 WPF 是一项出色的 UI 技术 并且具有 ItemsControl DataT
  • 访问 ControlTemplate 内的控件

    这是 xaml
  • 设置不可调整大小的 GridViewColumn

    我在 C WPF 应用程序中使用 ListView 和 GridViewColumn 对于某些列 我使用可见性管理器 this one https stackoverflow com a 9634769 6479770 但是 当第 1 列和
  • wpf C# 中的内存泄漏

    我正在使用 GalaSoft MvvmLight 套件和 WPF Toolkit 开发 WPF MVVM v3 5 中 应用程序DataGrid and DatePicker 但是 每次加载应用程序时 我都会面临应用程序中的大量内存泄漏Us
  • 在 SVG 中旋转形状时保持旋转线性渐变不旋转

    SVG 或 WPF XAML 我对两者都持开放态度 并且需要 我不认为它们在实现上有任何不同 下面的示例是 SVG 中的 我试图找到一种在线性渐变上使用旋转的方法 在本例中为 270 但是当它填充的形状旋转时 保持线性渐变不变 就好像它填充
  • 如何在选项卡控件对象中禁用选项卡换行

    我正在 WPF C 中设计 GUI 并且使用Tab Control目的 我的tab control将包含很多选项卡 我想知道如何禁用对象的默认 包装 行为 基本上相反this https stackoverflow com question
  • 如何让窗口最大化时所有控件按比例调整大小?

    当我单击最大化按钮时 窗口最大化 但控件未按比例调整大小 使控件相应调整大小的最佳方法是什么 我正在使用MVVM 这是我的代码
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • WPF 中的哪个表/网格控件?

    我希望显示表格数据 电视频道 但具有 DataGrid UniformGrid Table with FlowDocument 等选项 我不知道什么是最好的选择 主要问题是单元格的大小不均匀 因为它根据时间长度而变化 我也想在它们之间放置填
  • 如何在WPF中应用WS_EX_TRANSPARENT?

    我想制作一个启动画面 无法通过鼠标 UI 单击 选择 因此我如何申请 Win32 ExtendedWindowStyles WS EX TRANSPARENT 在 Windows 演示基础窗口上 在表格中我会这样做 https stacko
  • 绑定到布尔值的可见性的 TargetNullValue

    我有一个Grid whose Visibility使用以下方法将属性绑定到某个模型的布尔属性Converter
  • 通过绑定启用 TabItem

    我想在不同页面是 TabItem 的应用程序中使用 MVVM 为此 我使用视图模型 项目 的可观察集合并将其绑定到选项卡控件 ItemSource 对于每个视图模型 我创建了一个单独的数据模板来呈现正确的视图 如下所示
  • 当 DataContext 更改时立即更新 Binding

    我试图在更改 DataContext 后立即测量对象 但对象的绑定没有得到足够快的更新 这是我的代码 In MeasureOverride Size m inputWidth 0 0 Size elemSize new Size doubl
  • 如何在 WPF Visual Studio 设计器中显示占位符值,直到可以加载实际值

    我是一名经验丰富的 C 开发人员 但还是一名 WPF 新手 我认为是基本问题 我无法通过网络搜索找到答案 这是简化的用例 我想在 WPF TextBlock 中显示一个字符串 所以我在 XAML 控件的代码隐藏中编写了一些 C 代码 pub
  • WPF MVVM后台打印数据绑定问题

    我正在使用 wpf mvvm 开发一个销售点应用程序 在交易生命周期的许多阶段 都会在后台打印收据 我已经使用其他示例在后台生成和打印收据 我正在后台打印一个 UserControl 一切看起来都很棒 然后 我为该控件创建了 ViewMod
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似
  • TextBlock 中的 C# 超链接:单击它时没有任何反应

    在我的 C 独立应用程序中 我想让用户单击一个链接来启动他们最喜欢的浏览器 System Windows Controls TextBlock text new TextBlock Run run new Run Link Text Hyp
  • WPF 数据网格性能

    我正在使用 WPF Toolkit 数据网格 它目前滚动速度非常慢 该网格有 84 列和 805 行 包括 3 个固定列 标题是固定的 水平和垂直滚动都非常慢 虚拟化已打开 并且我已在 xaml 中显式启用列虚拟化和行虚拟化 是否有什么需要
  • 如何在WPF ListView中显示时间日志的内容?

    我一直在寻找答案 但我还没有真正找到答案 我知道逻辑 但我只是不知道如何实现它 这是我的时间日志 No Mchn EnNo Name Mode IOMd DateTime 00001 1 00001234 1 0 2004 01 01 01
  • 如何通过在 FlowDocument 中单击鼠标来获取 TextPointer

    我想获取用户在 FlowDocument 中单击的单词 我当前正在向文档中的每个 Run 添加一个事件处理程序 并迭代单击的 Run 中的 TextPointers 对每个 Run 调用 GetCharacterRect 并检查矩形是否包含

随机推荐

  • 访问主程序子目录中的文件

    包含我的主要可执行文件的文件夹非常混乱 其中包含输入 输出和源文件 我想将其中一些文件移动到可执行文件的不同目录中 但仍然能够访问它们 例如 如果我可以制作一个目录 那就太好了 main outfile 它保存了我的程序的所有输出文件 在
  • OpenSSL ASN.1 编程教程

    我正在寻找有关使用 OpenSSL 库进行 ASN 1 DER 编码的任何 C C 教程 示例代码或文档 好吧 正如您在 openssl 网站上看到的那样 没有 ASN 1 函数的官方文档 但你总是可以下载 openssl 源 http o
  • Docker 不会在目录中搜索文件

    我创建了一个 docker 文件 FROM node 13 6 0 alpine3 10 WORKDIR src RUN apk add no cache bash COPY package json COPY package lock j
  • Marklogic Eclipse 设置

    我一直在尝试使用 marklogic 设置 eclipse 以将其用作我的 xquery 编辑器 我按照 Marklogic 关注此链接 http developer marklogic com learn xqdt setup http
  • Google Drive API Java 权限 500 内部错误

    我有下一个共享 Google Drive 文件的方法 public static boolean shareFile HttpServletRequest httpReq String fileId String user String r
  • setMultiChoiceItems 和 setMessage 在 AlertDialog 中不“工作”

    我很困惑为什么我的对话框无法正常工作 AlertDialog dialog final AlertDialog Builder builder new AlertDialog Builder this final CharSequence
  • 将“ngModelOptions”从自定义组件传递到包含的本机元素

    我有一个名为的自定义组件 Angular 6 ppo currency field使用以下模板 span class display formattedValue span
  • 带有文件扩展名的 ASP.NET MVC 路径

    在使用基于属性的路由的 ASP NET MVC5 中 我想处理带有文件扩展名的 URL 例如 javascript security js 下面是一个控制器操作方法示例 Route javascript security js public
  • 静态函数/变量

    我刚刚开始用 C 编程 这个静态变量 函数的概念对我来说并不清楚 为什么要使用它 还有其他替代方案吗 static 可能会有点令人困惑 因为它的含义根据使用位置的不同而略有不同 全局声明的静态变量仅在该源文件中可见 本地声明的静态变量将在对
  • 多个 Django 存储后端系统

    我有一个 django 应用程序 它使用 S3BotoStorage 后端在 Amazon s3 上存储上传的文件 但在 Web api 服务 使用 django tastypie 中 在 s3 上上传文件需要很长时间 因为有请求通过 We
  • C++ 中最短的程序

    我最近遇到了这段可以编译但运行时出现分段错误 g 的代码 这是来自 topcoder 的原始链接 include
  • PHP中如何获取一个句子的第一个单词?

    我想从字符串中提取变量的第一个单词 例如 采用以下输入 结果输出应该是Test 这是输入的第一个单词 我怎样才能做到这一点 有一个字符串函数 strtok http php net strtok 可用于将字符串拆分为更小的字符串 token
  • Javascript - 使用 forEach 向后循环数组

    有没有办法使用向后循环数组forEach 不是任何其他类型的循环 我知道如何使用 for 标准方式 并且没有实际反转数组本身 let arr 1 2 3 arr slice reverse forEach x gt console log
  • 如何避免 http://static.ak.facebook.com/connect/xd_arbiter.php 的链接无限期挂起[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我们在我们的网站上使用 Facebook 评论和 Facebook Like 按钮 这些以某种方式生成一个调用http
  • 在序列化器 django 中使用分页

    我正在开发一个 django 项目 在该项目中我试图获取所有具有update ts场大于product sync ts from Product一次从服务器获取表 但由于产品数量很大 这需要大量时间来获取所有数据 我还将当前时间戳与数据一起
  • 如何使用 IComparable 之类的方法自然地对 DataView 进行排序

    我的 DataView 表现得很有趣 它按字母顺序对事物进行排序 而我需要它按数字对事物进行排序 我在整个网络上查找了这个问题 发现了很多关于如何使用 ICompare 对其进行排序的想法 但没有什么真正可靠的 所以我的问题是 如何在 Da
  • 如何在 Jetpack Compose 中用 TextField 替换部分文本?

    例如我有这个 TAKE O take those lips away That so sweetly were forsworn And those eyes the break of day Lights that do mislead
  • 在 RSpec 中测试模块

    在 RSpec 中测试模块的最佳实践是什么 我有一些模块包含在几个模型中 现在我只是对每个模型进行重复测试 几乎没有差异 有办法把它弄干吗 拉德方式 gt let dummy class Class new include ModuleTo
  • FilterOutputStream 的用法

    实际用途是什么FilterOutputStream在Java中 来自javadoc 该类是所有过滤输出流的类的超类 这些流位于已存在的输出流 底层输出流 之上 它用作基本数据接收器 但可能会沿途转换数据或提供附加功能 对我来说 它似乎有相同
  • contentpresenter.content 上的数据触发不起作用

    我正在尝试基于数据触发器切换 contentpresenter 的内容 我想在 contentpresenter content 中显示用户控件 如果我设置了值 否则我需要显示错误消息 但是我的 datatrigger 上的绑定失败指出未找