web-dev-qa-db-ja.com

コードビハインド内からコントロールテンプレートの要素にアクセスする方法

コンテンツコントロールのコントロールテンプレート内にあるユーザーコントロールにアクセスしようとしています。具体的には:

  <ContentControl x:Name="MyList" >
        <ContentControl.Template>
            <ControlTemplate x:Name="MyControlTemplate">
                <Border RenderTransformOrigin="0,0" x:Name="border">
                    <UserControls:MyControl x:Name="MyControlName" Width="100" ViewModel="{Binding}" />

This.MyListにアクセスできますが、this.MyControlNameが見つからないと表示されます。この状況で分離コードからMyControlNameオブジェクトにアクセスするにはどうすればよいですか?

ありがとう!

42
Locksleyu

テンプレートを取得し、テンプレート化されたコントロール上の名前でコントロールを見つける必要があります。

var template = MyList.Template;
var myControl = (MyControl)template.FindName("MyControlName", MyList);

テンプレートはまさにそれです:作成されるものの抽象的な説明、テンプレート内のコントロールは、テンプレート化されているもののコンテキストにのみ存在します。


テンプレートの対象となるコントロールを作成している場合は、コントロールテンプレート内の要素にのみアクセスする必要があることに注意してください。外部からのアクセスは、バインドされたプロパティとメソッドを介して行う必要があります。

データテンプレートの場合、これは同様です。アクセスする必要があるものはすべてオブジェクトにバインドし、アクセスはそのオブジェクトを介して行う必要があります。これは、アイテムを仮想化するアイテムコントロールの場合に特に当てはまるため、ほとんどの場合要素は存在しません。

75
H.B.

Uは、コントロールにLoadedイベントを追加し、コードでイベントの送信者を変数に割り当てることにより、すべてのテンプレートからコントロールを取得することもできます。

8
Dawid Jablonski