首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WPF:为什么没有在逻辑子上引发DataContextChanged?

在逻辑子上引发DataContextChanged的主要原因是,WPF的数据上下文系统在逻辑子树中的处理方式与视觉子树不同。在视觉子树中,数据上下文从父级继承到子级,但在逻辑子树中,这种继承关系并不存在。因此,当数据上下文在逻辑子树中发生变化时,WPF并不会自动引发DataContextChanged事件。

为了解决这个问题,您可以手动监听数据上下文的变化,并在需要时引发DataContextChanged事件。您可以使用PropertyChangedCallback来监听数据上下文的变化,并在PropertyChangedCallback中引发DataContextChanged事件。例如:

代码语言:csharp
复制
public static readonly DependencyProperty DataContextProperty = DependencyProperty.Register("DataContext", typeof(object), typeof(MyControl), new FrameworkPropertyMetadata(null, OnDataContextChanged));

public object DataContext
{
    get { return GetValue(DataContextProperty); }
    set { SetValue(DataContextProperty, value); }
}

private static void OnDataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MyControl control = (MyControl)d;
    control.RaiseEvent(new RoutedEventArgs(DataContextChangedEvent));
}

public static readonly RoutedEvent DataContextChangedEvent = EventManager.RegisterRoutedEvent("DataContextChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyControl));

public event RoutedEventHandler DataContextChanged
{
    add { AddHandler(DataContextChangedEvent, value); }
    remove { RemoveHandler(DataContextChangedEvent, value); }
}

在上面的代码中,我们使用了DependencyProperty来定义数据上下文属性,并在PropertyChangedCallback中引发DataContextChanged事件。这样,当数据上下文发生变化时,我们就可以监听到这个事件并采取相应的措施。

总之,WPF的数据上下文系统在逻辑子树中的处理方式与视觉子树不同,因此在逻辑子上引发DataContextChanged需要手动实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么同样的WPF控件不同的电脑呈现外观不一致

今天有同事跑过来说遇到了一个奇怪的bug,同样的程序win7和win10上界面相差了2个像素 ---- 一开始我们以为是半像素或者是分辨率的问题。 结果调试了很久都没有结果。...下面两个图分别是win7和win10情况下soonp获得的可视化树(已用demo替换) image.png image.png 有么有发现TabControl的元素Grid多出了一个名字templateRoot...代码里面查找,发现并没有这个名字的Grid,所以可以确定这个是来自TabControl的默认Style 所以我们找到win7和win10 下的默认主题 Aero和Aero2 查找方法可以参见博客默认的...WPF样式在哪里 我们分别放在DotPeek中反编译下,获取theme中对应的样式baml image.png image.png 有没有发现这个名字呀。...当然对于这样子的问题的确不是很好定位,因此我们有两种可行的解决方案 1、尽量关键界面使用自定义样式,对元素的呈现细节进行控制 2、App.xaml中指定主题样式。

1.2K20

WPF自学入门(三)WPF路由事件之内置路由事件

没有想过.NET中已经有了事件机制,为什么WPF中不直接使用.NET事件要加入路由事件来取代事件呢?...最直观的原因就是典型的WPF应用程序使用很多元素关联和组合起来,是否还记得WPF自学入门(一)XAM基本知识中提到过两棵树,逻辑树LogicalTree 和可视化树 VisualTree,那么它们分别是什么...下面先来了解一下WPF内置的路由事件和原理,然后我们来创建一个属于自己的路由事件。 1、WPF内置的路由事件 新建WPF项目,页面上放置按钮。...我点击的是按钮,为什么Grid和Window也会引发事件呢?...路由事件实际分两类:气泡事件和预览事件(也叫做隧道事件)。上文中的例子就是气泡事件。

1.5K20

学习WPF——初识依赖项属性

,要么静态构造函数中完成这项工作 DependencyProperty没有公有的构造函数,必须使用DependencyProperty的Register函数来创建实例 依赖项属性实例创建出来之后,不允许修改...,所以上面例子中NameProperty是只读的 最后一部是使用传统的.NET属性来封装WPF依赖项属性 不应该在.NET属性包装的时候添加验证属性值的代码、引发事件的代码 位于最顶端的元素,某一个属性设置了值...,他的元素也会继承这个属性的值 下面的例子中,我们设置Window元素的FontSize为30,这样Button的FontSize的属性值虽然没有设置 但他自动继承了Window的相关设置的值 (这非常像...HTML中的样式设置) 如果我们不希望值继承的特性影响元素的属性,那么只要给元素相关属性设置你期望的值即可 但需要注意的是: 并不是所有的依赖项属性都有值继承的特性 总结 WPF中的依赖项属性和...如果当前没有值,则依赖属性会遍历整个逻辑树直至它找到一个值。

91870

WPF面试题大全,秒杀面试官必备

为什么WPF会使用它? 6、WPF中什么是样式? 7、阐述WPF中什么是模板? 8、阐述WPF视觉树VS 逻辑树? 9、解释—下ResourceDictionary ?...为什么WPF会使用它? 答: 依赖属性: WPF中,依赖属性(Dependency Property)是一种特殊类型的属性,用于UI元素中存储和管理属性值。...为什么WPF中使用依赖属性: • 数据绑定和样式:依赖属性天生支持数据绑定和样式,使开发人员可以轻松地实现动态更新和样式化的UI元素。...8、阐述WPF视觉树VS 逻辑树? 答:视觉树是指WPF用户界面屏幕呈现的结构。它由一系列的视觉元素组成,例如控件、布局、动画等。视觉树是WPF用户界面的最终表现形式。...10、WPF路由事件的哪三种方式/策略(冒泡 直接 隧道)? 答:直接路由事件(Direct Routed Events):直接路由事件是特定元素引发并处理的事件。

57710

VisualTreeHelper

Silverlight中只有可视化树,没有WPF中的逻辑树,这一点可从SL的sdk文档中得到印证: 可视化树概念也存在于 WPF 中,它与 Silverlight 的可视化树概念类似。...然而,一个显著的差异是 WPF 还提供一个附加的筛选器或对象树(称为"逻辑树")的概念。逻辑树概念与某些属性系统行为相关。Silverlight 不通过帮助器类来公开此逻辑树。...Silverlight 中的确存在某些(但并非所有)相关的属性行为,但由于没有用于访问这些行为的帮助器 API,因此,逻辑树概念在 Silverlight 中将没有用武之地,因此本文档不讨论它。...缺少逻辑树而引发的一个很小的兼容性问题是:FrameworkElement..::..Parent 属性行为 Silverlight 版本 3 中是不同的,它实际上报告可视化树父项。...GetChildrenCount 返回可视化树中某一对象的子集合中存在的级的数目。  GetParent 返回可视化树中某一对象的父对象。

79870

WPF面试题-来自ChatGPT的解答

这些方法用于执行命令、检查命令是否可执行以及命令的可执行状态发生改变时引发事件。...当我们XAML中定义UI界面时,实际创建可视化树。WPF框架会根据可视化树来确定UI元素的位置和大小,并将它们渲染到屏幕逻辑树是另一个层次结构,它描述了UI元素之间的逻辑关系。...逻辑树用于处理UI元素的事件和命令。每个UI元素都有一个逻辑父元素和零个或多个逻辑元素。逻辑树中的元素通常与可视化树中的元素相对应,但并不完全相同。...例如,一个按钮是一个逻辑控件,它可以处理点击事件并执行相应的命令。 某些情况下,可视化树和逻辑树可能会有所不同。例如,某些可视元素可能没有对应的逻辑元素,或者一个逻辑元素可能对应多个可视元素。...它们功能、外观、使用方式和嵌套关系上有所不同,但在WPF中常常一起使用来实现内容的显示和呈现。 39. 为什么需要依赖属性?

35230

【愚公系列】2023年11月 WPF控件专题 2023秋招WPF高频面试题

说说WPF中的XAML是什么?为什么需要它?它只存在于WPF吗? XAML 是用来组织 WPF UI 的 XML 文件。...定义资源的最佳方式是 Window 或 Page 元素级别。 为元素定义的任何资源也适用于该元素的元素。...一个很好的例子是标准 WinForms 中处理鼠标按钮的 onClick 事件。 这是 GUI 项中引发事件并由所述 GUI 元素处理的地方。...默认值依赖属性中存储一次。值继承当访问依赖项属性时,将使用值解析策略来解析该值。 如果没有设置本地值,则依赖属性会向上导航逻辑树,直到找到一个值。...默认值依赖属性中存储一次。值继承当访问依赖项属性时,将使用值解析策略来解析该值。 如果没有设置本地值,则依赖属性会向上导航逻辑树,直到找到一个值。

45422

WPF 自定义控件入门 可重写的各个方法或属性的意义

逻辑树,可视化树(又被我称为视觉树),控件,布局,元素,依赖属性,附加属性 本文将使用直接继承 FrameworkElement 的自定义控件类型为例子,由于 WPF 里面有着新手比较友好的设计,自己定义的一层...但有些情况,例如这个控件元素仅仅只包含一个级,一个控件且是固定的类型,而且从业务逻辑也不是一个容器的概念。这个时候咱依然可以继承 FrameworkElement 来进行自己编写。...在有需要将自定义控件的 OnRender 方法的内容打到界面上以及让自定义控件参与命中测试时,还需要加上更多的代码 先分析一下为什么 F2 的 OnRender 方法没有界面打出来绘制的圆形。... OnRender 方法打断点,运行代码,可以看到断点没有进来 根据 dotnet 读 WPF 源代码笔记 布局时 Arrange 如何影响元素渲染坐标 博客,可以了解到, WPF 里面是会在 Arrange...因为 WPF 框架设计 Arrange 就是专门给上一级控件布局时调用的。

1.3K20

WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题

触屏事件连带触发鼠标事件的问题 这个是 WPF 已知的问题,网络也有一些讨论,但是没有一个完美的方法来解决。...带有 Preview 前缀的是隧道事件(可视为事件前触发),没有的是冒泡事件(可视为事件后触发,此处省略)。 那么如何去除触屏事件后连带引发鼠标事件的影响呢?...通过在网络苦苦搜索和尝试,旧版的微软社区找到了一个可行的方法,帖子为《Prevent a WPF application to interpret touch events as mouse events...(没有去尝试,感兴趣的朋友可以试试): 二、DataGrid 误触问题及解决方法 上一个部分介绍了去除触屏事件后连带引发鼠标事件影响的方法,也就是通过鼠标事件参数的 StylusDevice 属性来判断是否是由触屏操作引发的...然而,本次我实际是要解决一个 DataGrid 表格触屏下的误触问题,相关业务逻辑是在行改变事件(转为命令了)中的,本来是没有写 PreviewTouchDown 和 PreviewMouseDown

2.7K10

c# 温故而知新: 线程篇(一) 下

Abort 方法: 其实 Abort 方法并没有像字面上的那么简单,释放并终止调用线程,其实当一个线程调用 Abort方法时,会在调用此方法的线程引发一个异常: ThreadAbortException...AbortRequest),如果你finally语句块中执行很复杂的逻辑或者计算的话,那 么只有等待直到运行完毕才真正销毁主线程(也就是说主线程的状态会变成Aborted,但是由于是主线程所以无法看出...直到调用 Resume 后,才挂起的线程中引发 ThreadAbortException。...Interrupt 方法: Interrupt 方法将当前的调用该方法的线程处于挂起状态,同样调用此方法的线程引发一个异常:ThreadInterruptedException,和Abort方法不同的是...Priority 这个属性表示线程的优先级,我们可以用ThreadPriority这个枚举来设置这个属性 ThreadPriority包含有5个优先级大家了解下就行 10 Thread的简单示例 WPF

62060

OEA 中 WPF 树型表格整体重构

为什么要重构     两个月主要做了一件事情,那就是把 OEA 框架中的 TreeGrid 控件,从结构重新设计,并大量重构现有代码。...但是, WPF 环境下,一直没有找到比较好用的 TreeGrid。而我们的 TreeGrid,由于之前做得一直不彻底,代码比较乱,经常出现 BUG,修改起来也非常费时。...元素的逻辑行为与渲染是分离的:     元素发生诸如点击、拖动、选择等逻辑行为时,其实只变更了它内部的状态数据。...通过添加一些 bool 类型的防止重入的字段,Measure 中可以做所有逻辑操作之后、渲染之前的控件构造、刷新、替换、状态变更,并对最终确定的可视树元素进行测量。如: if(this....查看 WPF 源码时,可以经常看到一些代码,通过可视树关系查找指定类型的元素后,再要对元素的可空性进行判断。而经常做这些可空性检测的原因是,WPF 控件的设计要求,各控件互相之间没有必然的联系。

1.8K60

WPF 已知问题 ObservableCollection 的 CollectionChanged 修改集合内容将让 UI 显示错误

本文记录一个 WPF 已知问题, ObservableCollection 的 CollectionChanged 事件里面,绕过 ObservableCollection 的异常判断逻辑,强行修改集合内容...最常见的原因有: (a)引发相应事件的情况下更改了集合或集合的计数,(b)引发的事件使用了错误的索引或项参数。...要获得更及时的异常,应将生成器附加的属性“PresentationTraceSources.TraceLevel”设置为值“High”,然后重新运行该方案。...这会使得发生每个 CollectionChanged 事件之后运行检测逻辑,因此,这将减慢应用程序的运行速度。...通过以上的异常信息也可以了解到为什么 WPF 存在此已知问题,因为原本预期就是开发者不能在集合变更时修改集合,如果在每个集合变更里都需要重新处理状态,将会让 WPF 的性能很差。

2.3K30

Windows wpf(下载应用介绍教程)

一、窗体类基本概念     对于WPF应用程序,Visual Studio和Expression Blend中,自定义的窗体均继承System.Windows.Window类。...独立 WPF 应用程序使用 Window 类来提供它们自己的窗口。 WPF 中,可以使用代码或 XAML 标记来实现窗口的外观和行为。...当窗口变为活动窗口时,它会引发 Activated 事件。     当第一次打开窗口时,只有引发了 Activated 事件之后,才会引发 Loaded 和 ContentRendered 事件。...记住这一点,引发 ContentRendered 时,便可认为窗口已打开。      窗口变为活动窗口之后,用户可以同一个应用程序中激活其他窗口,还可以激活其他应用程序。...当这种情况出现时,当前的活动窗口将停用,并引发 Deactivated 事件。 同样,当用户选择当前停用的窗口时,该窗口会再次变成活动窗口并引发 Activated。

1.2K20

WPF性能优化:Freezable 对象

Freezable是WPF中一个特殊的基类,用于创建可以冻结(Freeze)的可变对象。冻结一个对象意味着将其状态设置为只读,从而提高性能并允许多线程环境中共享对象。...那是不是WPF中的所有资源都可以(需要)使用Freeze方法冻结来提高性能呢? Freezable类通常用于WPF中的资源和动画,例如创建可重用的画刷、几何图形和动画。...由于它们包含非托管资源,因此系统必须监视这些对象发生的修改,然后原始对象发生更改时更新对应的非托管资源。即使实际并未修改图形系统对象,系统仍必须消耗一些资源来监视该对象,以防更改它。...尽管使用纯色画笔来描述按钮的绘制方式,但纯色画笔实际没有进行绘制。图形系统为按钮和画笔生成快速、低级别的对象,实际显示屏幕的就是这些对象。 如果要修改画笔,则必须重新生成这些低级别对象。...它包含无法冻结的Freezable对象。 Freezable对象调用Freeze方法冻结后,就无法解冻。修改冻结对象属性时会引发InvalidOperationException。

31430

为什么 WPF 软件 win7 启动时会尝试调起 wisptis 进程

我看到一个问题是 win7 系统,如果开机启动的软件是 WPF 软件,而这个 WPF 软件系统的 wisptis 进程启动之前就启动了,那么 WPF 将会调起 wisptis 进程。...但是被 WPF 启动的 wisptis 进程存在这样的问题,触摸屏 win7 的双指打开右键菜单等功能不可用 WPF 启动时,将会在 Window 类的 Visibility 修改时调用到 WispLogic.RegisterHwndForInput...方法进行初始化触摸,这部分详细请看 WPF 触摸到事件 而在初始化触摸时,需要用到 PenIMC 的逻辑 win7 系统,触摸需要通过 wisptis 进程的辅助才能让 WPF 进程能够完成实时触摸...这个文件就是提供给 WPF 的触摸核心 PenThreadWorker 的 COM 组件(其实没有文档说这货是纯 COM 组件) 也就是和触摸相关的 也就是 WPF 窗口打开显示将会初始化触摸,初始化触摸需要依赖...wisptis 进程的启动 而为什么 WPF 启动的 wisptis 进程有很多坑?

88020

dotnet 读 WPF 源代码笔记 GlyphRun 的 DeviceFontName 的功能是什么

本文将告诉大家这个属性的细节逻辑 在上一篇博客 WPF 简单聊聊如何使用 DrawGlyphRun 绘制文本 里面就提到如何创建 GlyphRun 对象,创建的时候发现设置的 DeviceFontName...参数,无论设置为什么值,结果都没有变化 官方文档对于 GlyphRun.DeviceFontName 的描述也是比较不清不楚的。...我本来以为这是一个能用来优化性能的属性,但是我似乎没有在网上找到大佬们讨论过这个属性。好在 WPF 是完全开源的,我就开始阅读源代码。...,这也就是为什么传入任何的值,都不会影响结果的原因 我猜测这是远古的 WPF 存在多个代码版本时,某些代码版本,这个属性是有实际实现逻辑 但是我好奇的是, DX 没有任何可以和这个属性对应的,...仓库里面包含了完全的构建逻辑,只需要本地的网络足够好(因为需要下载一堆构建工具),即可进行本地构建

22940
领券