いくつかのカスタム状態のプロパティに応じて、関連するXAMLファイルのリソースとしてすべて定義されているさまざまなContentTemplatesをスワップするUserControl(見た目のないカスタムコントロールではありません)があります。コードビハインドでは、スワップインされたContentTemplatesの要素の1つを見つける必要があります。
ルックレスコントロール(つまり、カスタムコントロール)では、OnApplyTemplateをオーバーライドしてから、FindNameを使用しますが、ContentTemplateがトリガーによって切り替えられたときにそのオーバーライドは発生しません(少なくともUserControlの場合はそうではありません。私はしていません)。カスタムコントロールを使用してその機能をテストしました。)
ここで、Loadedイベントをスワップインされたテンプレートのコントロールに接続してみました。これはコードビハインドで発生します。次に、「sender」をクラスレベルの変数に格納します。ただし、Unloadedイベントをサブスクライブしてその値をクリアしようとすると、tempalteがスワップアウトされて、呼び出される前にそのイベントの配線が解除され、コントロールが画面からサイレントにアンロードされるため、このイベントは発生しません。しかし、私はまだコードビハインドでそのハングした参照を持っています。
OnApplyTemplate機能をシミュレートするために、ContentTemplateChanged通知をサブスクライブし、VisualTreeHelperを使用して必要なコントロールを探すことを検討していますが、もっと良い方法があるかどうか疑問に思っているので、この投稿をご覧ください。
何か案は?
参考までに、これは私が持っているコントロールの非常に簡略化された例です。この例では、IsEditingがtrueの場合、「FindMe」という名前のテキストボックスを検索します。IsEditingがfalseの場合、つまりContentTemplateがスワップインされていない場合、「null」を取得したい...
<UserControl x:Class="Crestron.Tools.ProgramDesigner.Controls.EditableTextBlock"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Crestron.Tools.ProgramDesigner.Controls"
x:Name="Root">
<UserControl.Resources>
<DataTemplate x:Key="EditModeTemplate">
<TextBox x:Name="FindMe"
Text="{Binding Text, ElementName=Root}" />
</DataTemplate>
<Style TargetType="{x:Type local:EditableTextBlock}">
<Style.Triggers>
<Trigger Property="IsEditing" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource EditModeTemplate}" />
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<TextBlock x:Name="TextBlock"
Text="{Binding Text, ElementName=Root}" />
</UserControl>
Aaaaaaand GO!
M