Ela*_*lad 5 c# wpf datacontext
该FrameworkElement对象有DataContextChanged事件。但是,没有OnDataContextChanged可以覆盖的方法。
任何想法为什么?
如果方法是虚拟的,则用户可以选择通过调用基类方法来增强基功能,或者通过不调用基类方法来替换基类功能。对于 OnEvent() 方法,如果不调用基类方法,则不会引发事件(这是基类方法的责任)。如果基类在 OnEvent 方法内部执行某种状态管理,这意味着,如果用户选择省略对基类方法的调用,则派生类可能会意外地使对象的状态无效。文档可以指定“请始终调用基类方法”,但无法强制执行。
当我看到没有虚拟 OnEvent() 方法的事件时,我通常假设该方法执行某种内部状态管理,并且该类的设计者希望保证其状态管理运行。FrameworkElement 中并非如此,而且它也不是唯一不遵循该模式的事件,所以我很好奇原因是什么。
我在 Reflector 中进行了挖掘,看看是否能找到原因。有一个OnDataContextChanged() 方法,但它是一个依赖属性更改处理程序,并且不遵循标准事件模式。这可能是不将其设为受保护虚拟的原因。它是非标准的,所以会令人困惑。它是静态的,因此您无论如何都无法覆盖它。由于它是由依赖属性框架自动调用的,并且您无法覆盖它,因此我相信我们有理由选择它是私有的而不是静态虚拟的。
您可以使用不同的模式来公开正常的事件模式:
class FrameworkElement
{
// difference: use DataContextPropertyChanged as the change callback
public static readonly DependencyProperty DataContextProperty = ...
protected virtual void OnDataContextChanged(...)
{
// raise the DataContextChanged event
}
private static void DataContextPropertyChanged(...)
{
((FrameworkElement)d).OnDataContextChanged(...);
}
}
Run Code Online (Sandbox Code Playgroud)
我猜他们为什么不这样做?通常您调用 OnEvent() 来引发事件。当 DataContext 更改时,会自动引发该事件,并且在任何其他时间引发该事件是没有意义的。