在 WPF 中找出 OnPropertyChanged 事件的接收者

Posted

技术标签:

【中文标题】在 WPF 中找出 OnPropertyChanged 事件的接收者【英文标题】:Find out the recipients of the OnPropertyChanged event in WPF 【发布时间】:2018-01-30 16:11:51 【问题描述】:

我正在其他人编写的项目中进行逆向工程。 GUI 是用 WPF 制作的,有几个窗口。一个类实现了INotifyPropertyChanged 接口,2 个属性触发OnPropertyChanged 事件以发出数据信号。

我的目标是找出哪些控制从这个事件中获利。当来自 2 个属性的 OnPropertyChanged 事件被触发时,如何找到所有实际利用信息的控件?

寻找委托的所有引用并没有得到任何结果。没有明确注册此事件。依稀记得这个连接可以在WPF中的XAML代码中使用绑定建立,但是我对WPF了解的不够多,自己找这个资料。

任何帮助将不胜感激

【问题讨论】:

您可以为此使用外部工具吗? @DHansen 取决于工具。你有什么想法? snoopwpf.codeplex.com 是我在开发/调试 WPF 应用程序时大量使用的。允许在运行时查看应用程序中的变量、属性、模板等。 GetInvocationList 不能满足您的需求吗?无论是通过 xaml 还是代码注册,调用列表都会在您调用它时包含所有事件处理程序。您可能需要练习应用程序的每个功能,以确保您能看到所有功能。 @DHansen 谢谢你的链接,听起来像是一个足智多谋的工具。我去看看。 【参考方案1】:

假设您的两个属性分别命名为FirstPropertySecondProperty。只需在 XAML 中查找对它们的绑定引用,例如:

Binding FirstProperty
Binding FirstProperty, ...
Binding [whatever].FirstProperty, ...
Binding ..., Path=FirstProperty, ...
Binding ..., Path=[whatever].FirstProperty, ...

使用这些绑定的控件将获得PropertyChanged 事件。例如,如果您发现:

<TextBlock x:Name="myText", Text="Binding FirstProperty" />

这意味着上面的 TextBox 控件将对PropertyChanged 事件通知的FirstProperty 更改做出反应。

【讨论】:

这听起来像是一种很有前途的方法。我发现了第三个变量,在整个解决方案中搜索属性名称实际上会导致 XAML 文件中的条目。 Binding Path=prop3。其他2个还没有找到。我怀疑有人会创建属性,给他们事件调用而不使用它们。但看起来确实是这样。 谢谢,可惜我只能选择一个正确的答案,所以我选择了最先出现的那个。 :) 谢谢@MongZhu。如果你真的想了解数据绑定和 DataContext 之类的东西是如何工作的,我只能建议我为 WPF 新手制作的书:amazon.com/dp/1326847996【参考方案2】:

当触发 2 个属性的 OnPropertyChanged 事件时,如何找到所有实际利用信息的控件?

您需要查看所有 XAML 文件,其中实现INotifyPropertyChanged 接口的类可以用作任何具有Binding 的UIElement 的DataContext。在所有文件中搜索属性名称可能是最简单的方法。

由于绑定实际上是在运行时解析的,因此没有万无一失的方法可以在编译时找到所有绑定。

也可以通过编程方式设置绑定,但您应该能够通过右键单击属性并在 Visual Studio 中选择“查找所有引用”来找到它们。

【讨论】:

谢谢,尤其是DataContext 关键字。在我的情况下,参考搜索没有帮助,但搜索属性名称。尽管我的问题中的 2 仍然缺失。但我越来越相信它们实际上并没有在任何地方使用 OnPropertyChanged 方法是私有的,不是吗? 处理程序是protected,但在我的情况下事件是public 然后使用“查找所有参考文献”选项? 那么一切就绪。视图不绑定到任何事件。它们绑定到属性。

以上是关于在 WPF 中找出 OnPropertyChanged 事件的接收者的主要内容,如果未能解决你的问题,请参考以下文章

找出WPF中的树,模板,命令,事件,数据绑定,样式和主题

如何在设计模式下调试 WPF 用户控件?

WPF:使用模态对话框/ InputDialog查询用户

WPF TextBlock 负数为红色

WPF 数据网格光标在列调整大小时不会改变

如何使用拇指使 WPF 弹出窗口可拖动?