同様の問題がありました。最後に、分離コードから並べ替えました。XAML が得意でないことがいくつかあります。
DataTemplate のルート UserControl の Top プロパティを、それを含む ContentPresenter の Canvas.Top 添付プロパティにバインドする必要がありました。私の場合、ContentPresenter は、DataTemplate を基になるデータ オブジェクト コレクションに適用していた ItemsControl によって生成されていました。ContentPresenter の Content プロパティは、参照する必要がある Visual オブジェクトではなく、基になるデータ オブジェクトを指していました。これはまさにあなたが直面している問題ではありませんが、その核心は同じだと思います - ContentPresenter のビジュアル コンテンツへの参照を見つけようとしています。
最も内側の UserControl のコード ビハインドでは、EndInit メソッドをオーバーライドしてバインディングを結び付けました。私は 1 つの状況でのみコントロールを使用することを計画していたので、これは受け入れられましたが、状況に応じてコードを別の場所に移動することができました。
/// <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);
}
}