在 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】:假设您的两个属性分别命名为FirstProperty
和SecondProperty
。只需在 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 事件的接收者的主要内容,如果未能解决你的问题,请参考以下文章