【问题标题】:Element binding broken in dynamically added child动态添加的子元素绑定中断
【发布时间】:2012-07-11 18:27:34
【问题描述】:

我在 WPF 中创建了一个 Popup 控件,该控件动态创建一个弹出窗口并将其添加到显示树中的第一个子项中。在弹出窗口的内容 (PopupContent) 中,绑定有效,但元素绑定似乎被破坏了。

我将此归咎于我创建弹出窗口的方式。有没有办法解决这个问题,以便弹出窗口内容中的元素绑定按预期工作?

popupContainer = new PopupContainer();
popupContainer.Content =   PopupContent;
PopupContent.Visibility = Visibility.Visible;
rootContent.Children.Add(popupContainer);

【问题讨论】:

    标签: c# .net wpf popup elementname


    【解决方案1】:

    PopUp 控件有一个单独的VisualTree 并且不是主窗口/用户控件的VisualTree 的一部分,这就是Elementname 绑定不起作用的原因。

    Popup 控件没有自己的可视化树;它反而返回 当 Popup 的 MeasureOverride 方法为时,大小为 0(零) 叫。但是,当您将 Popup 的 IsOpen 属性设置为 true 时, 创建具有自己的可视化树的新窗口。新窗口 包含 Popup 的 Child 内容。

    http://msdn.microsoft.com/en-us/library/ms749018.aspx#PopupandtheVisualTree

    您可以尝试的是一种通常与 ContextMenus 一起使用的解决方法,即将弹出窗口添加到与您的窗口/用户控件相同的名称范围内 -

    popupContainer = new PopupContainer();       
    popupContainer.Content =   PopupContent;       
    PopupContent.Visibility = Visibility.Visible;       
    rootContent.Children.Add(popupContainer);  
    NameScope.SetNameScope(popupContainer, NameScope.GetNameScope(this)); //Or
    // NameScope.SetNameScope(popupContainer, NameScope.GetNameScope(rootContent)); 
    

    【讨论】:

    • 我没有使用内置弹出窗口,但名称范围听起来是正确的。我会试一试。
    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 2015-09-07
    相关资源
    最近更新 更多