1

UserControl に ContentPresenter があります。ContentPresenter のコンテンツはデータ オブジェクトであり、datatyped DataTemplate は ContentPresenter の UI を定義します (そのルートは別の UserControl です)。

外側の UserControl のボタンは、そのコンテンツを、ContentPresenter によってホストされる内側の UserControl で定義された添付プロパティの値にバインドする必要があります。XAML でこれを行うにはどうすればよいですか?

より広くは、異なる名前スコープまたはテンプレートの境界を越えて定義された視覚オブジェクトが相互作用するための良い方法は何ですか?

4

1 に答える 1

0

同様の問題がありました。最後に、分離コードから並べ替えました。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);
    }
}
于 2013-01-07T05:40:35.807 に答える