ユーザーが住所を入力するためのAddressInputコントロールを作成しました。私は、AddressTemplateというDataTemplateプロパティを用意しました。ContentPresenterに適用されるDataTemplateの要素を見つけるにはどうすればよいですか?
デフォルトのスタイルは次のようになります。私のアドレスデータテンプレートの
<Style TargetType="{x:Type addressUI:AddressInput}">
<Setter Property="AddressTemplate"
Value="{StaticResource DefaultAddressTemplate}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type addressUI:AddressInput}">
<GroupBox Header="Address">
<ContentPresenter ContentTemplate="{Binding Path=AddressTemplate, RelativeSource={RelativeSource TemplatedParent}}"
Content="{Binding Path=Address, RelativeSource={RelativeSource TemplatedParent}}"
x:Name="PART_AddressPresenter" />
</GroupBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
すべてを(「PART_CountriesList」という名前の)国を選択するためのコンボボックスが含まれています。選択が変更されたときに起動するコードビハインドアクションが必要です。これは、SelectionChangedイベントをフックする必要があることを意味します。私のAddressInputの中で、私はAddressTemplateでPART_CountriesListを見つける必要があります。
私はこのような "PART_AddressPresenter" のContentPresenter得ることができます。今、私はAddressTemplate内部に含まれる "PART_CountriesList" を得るのですか
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
var addressPresenter = Template.FindName("PART_AddressPresenter", this) as ContentPresenter;
}
を?
私はこの試み:
VAR countriesList = AddressTemplate.FindName( "PART_CountriesList"、addressPresenter)を、
addressPresenterのテンプレートがまだ適用されていないため、例外がスローされます。私はContentPresenterがOnApplyTemplateのオーバーライドを持っていることを知っていますが、この用途のために拡張するのは愚かなようです。
私はContentPresenterを拡張すると、OnApplyTemplateメソッドが実行されるたびにイベントを発生させる新しい再利用可能なバージョンを作成します。これはおそらく私の問題を解決するだろうが、それは狂っているようだ。より良い方法がありますか?