XAML DataTemplate に埋め込まれたコントロールへのアクセス: 実践ガイド
DataTemplate を利用してデータを表示する FlipView を操作しています。目標は、現在選択されているテンプレート内の特定の Image コントロールにアクセスすることです。 VisualTreeHelper.FindChildControl
は解決策のように思えるかもしれませんが、リピーター コントロールとそのインデックス付きアイテムの動的な性質を扱う場合には不十分です。
課題: 動的に生成されたテンプレート
中心的な問題は、XAML リピーターが DataTemplate を処理する方法に起因します。 これらのテンプレート内のコントロールの Name
プロパティを割り当てて依存することは、繰り返される各項目が独自のインスタンスを生成し、名前の競合につながるため、信頼性が低くなります。
解決策: ビジュアル ツリー トラバーサル
効果的なアプローチには、ビジュアル ツリーをナビゲートしてターゲット コントロールを見つけることが含まれます。このプロセスは 3 つの主要なステップで構成されます:
アイテム コンテナの識別: ItemContainerGenerator.ContainerFromItem
を使用して、選択したアイテムに対して生成されたコンテナを特定します。
ビジュアル ツリー探索: VisualTreeHelper.GetChildrenCount
と VisualTreeHelper.GetChild
を使用して、コンテナの子要素を再帰的に検索します。
コントロール識別: 取得したコントロールをフィルタリングして、そのタイプ (Image
) と必要に応じてその名前 (例: "img1") に基づいて目的のイメージ コントロールを分離します。
このソリューションを示すコード例は次のとおりです。
<code class="language-csharp">var container = models_list.ItemContainerGenerator.ContainerFromItem(models_list.SelectedItem); var children = AllChildren(container); var img = children.OfType<Image>().FirstOrDefault(x => x.Name == "img1"); </code>
再帰ビジュアル ツリー トラバーサル関数 (AllChildren
)
再帰関数 AllChildren
は、ビジュアル ツリー全体を探索するために重要です。
<code class="language-csharp">private List<Control> AllChildren(DependencyObject parent) { var list = new List<Control>(); for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) { var child = VisualTreeHelper.GetChild(parent, i); if (child is Control) { list.Add(child as Control); } list.AddRange(AllChildren(child)); } return list; }</code>
この関数は、体系的にビジュアル ツリーを走査し、すべての Control
要素をリストに追加します。
イメージ コントロールのターゲット
AllChildren
を使用してすべての子コントロールを取得した後、OfType<Image>().FirstOrDefault(x => x.Name == "img1")
行でリストをフィルターし、「img1」という名前の最初の Image
コントロールを返します。 FirstOrDefault
を使用すると、画像が見つからない場合に対処できます。
重要な考慮事項:
models_list.SelectedItem
が null でないことを必ず確認してください。FlipView
が複数の DataTemplate を使用する場合、正しいテンプレート コンテナーを正確に識別するためにフィルタリング ロジックを調整する必要があります。 これを容易にするために、テンプレートに一意の識別子を追加することを検討してください。この洗練されたアプローチは、FlipView
のようなリピーター コントロール内であっても、動的に生成された XAML DataTemplate 内のコントロールにアクセスするための堅牢で信頼性の高い方法を提供します。
以上がリピーター コントロールの XAML DataTemplate 内のコントロールにアクセスする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。