如何绑定XAML中ContentPresenter的可视内容?

时间:2012-09-03 16:30:35

标签: wpf xaml

我在UserControl中有一个ContentPresenter。 ContentPresenter的内容是一个数据对象,数据类型的DataTemplate定义了ContentPresenter的UI(其根是另一个UserControl)。

外部UserControl中的按钮需要将其内容绑定到ContentPresenter托管的内部UserControl上定义的附加属性的值。我如何在XAML中执行此操作?

更广泛地说,在不同的名称范围内或跨模板边界定义的可视对象的好方法是什么?

1 个答案:

答案 0 :(得分:0)

我有类似的问题。最后,我从代码隐藏中对其进行了排序。有些事情是XAML不擅长的。

我需要将DataTemplate的根UserControl的Top属性绑定到包含它的ContentPresenter的Canvas.Top附加属性。在我的例子中,ContentPresenter是由ItemsControl生成的,它将DataTemplate应用于底层数据对象集合。 ContentPresenter的Content属性指向底层数据对象,而不是我需要引用的Visual对象。虽然这不是你面临的问题,但我认为它的关键是相同的 - 试图找到对ContentPresenter的Visual内容的引用。

在最里面的UserControl背后的代码中,我通过覆盖EndInit方法来连接绑定。我只是计划在一种情况下使用控件,所以这对我来说是可以接受的,但代码可以根据你的情况移到别处。

/// <summary>
/// Indicates that the initialization process for the element is complete
/// </summary>
public override void EndInit()
{
    this.BindToParentContentPresenter();
    base.EndInit();
}

/// <summary>
/// Binds the Canvas.Top attached property of the content presenter to the top property of this object
/// </summary>
private void BindToParentContentPresenter()
{
    ContentPresenter cp = this.VisualParent as ContentPresenter;
    if (cp != null)
    {
        Binding b = new Binding();
        b.Source = this;
        b.Path = new PropertyPath(TopProperty);
        cp.SetBinding(SelectableUniformCanvas.TopProperty, b);
    }
}