2011-12-22 19 views
0

ユーザーが住所を入力するための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メソッドが実行されるたびにイベントを発生させる新しい再利用可能なバージョンを作成します。これはおそらく私の問題を解決するだろうが、それは狂っているようだ。より良い方法がありますか?

答えて

0

誰かがこれを行うには「正しい」方法を持っている場合、私は好奇心旺盛だけど、FindName指定して、私はいつもこのような何かに頼る終わる:あなたが待っているので、これはしかしちらつきが発生する可能性があります

Dispatcher.BeginInvoke(new Action(() => 
{ 
    // Call FindName here 
}), System.Windows.Threading.DispatcherPriority.Render); 

データのテンプレート化が完了してコードを実行するまでレンダリングされるので、実行しようとしているものがコントロールの外観に影響する場合、これは必ずしも最適なオプションではありません。

関連する問題