我在UserControl中有一个ContentPresenter。 ContentPresenter的内容是一个数据对象,数据类型的DataTemplate定义了ContentPresenter的UI(其根是另一个UserControl)。
外部UserControl中的按钮需要将其内容绑定到ContentPresenter托管的内部UserControl上定义的附加属性的值。我如何在XAML中执行此操作?
更广泛地说,在不同的名称范围内或跨模板边界定义的可视对象的好方法是什么?
答案 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);
}
}