gpt4 book ai didi

WPF:为什么 DataContextChanged 没有在逻辑 child 上提出?

转载 作者:行者123 更新时间:2023-12-04 00:12:10 27 4
gpt4 key购买 nike

DataContextChanged 没有在我的自定义 Panel 控件的逻辑子项上引发问题。我把它缩小到这个:

从我添加的向导生成的 WPF 应用程序开始:

    private void Window_Loaded( object sender, RoutedEventArgs e )
{
var elt = new FrameworkElement();
this.AddLogicalChild( elt );
DataContext = 42;
Debug.Assert( (int)elt.DataContext == 42 );
}

据我了解,这是可行的,因为 DataContextinheritable dependency property .

现在,我在 Window (this) 及其逻辑子级上为 DataContextChanged 添加事件处理程序:

    this.DataContextChanged += 
delegate { Debug.WriteLine( "this:DataContextChanged" ); };
elt.DataContextChanged +=
delegate { Debug.WriteLine( "elt:DataContextChanged" ); };

如果我运行它,只有第一个事件处理程序会执行。 为什么会这样?如果不是 AddLogicalChild(elt) 我执行以下操作:

this.Content = elt;

两个处理程序都会执行。但在我的情况下,这不是一个选项 - 我将 FrameworkContentElements 添加到我的控件中,这些控件不应该是可视子项。

这里发生了什么?除了 AddLogicalChild() 之外,我还应该做更多的事情来使它工作吗?

(幸运的是,有一个相当简单的解决方法 - 只需将元素的 DataContext 绑定(bind)到窗口的 DataContext )

BindingOperations.SetBinding( elt, FrameworkElement.DataContextProperty, 
new Binding( "DataContext" ) { Source = this } );

谢谢。

最佳答案

您也需要覆盖 LogicalChildren 属性:

protected override System.Collections.IEnumerator LogicalChildren
{
get { yield return elt; }
}

当然,您也希望返回由基本实现定义的任何逻辑子代。

关于WPF:为什么 DataContextChanged 没有在逻辑 child 上提出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/723655/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com