XAML DataTemplate のコントロールへのアクセス: 実践ガイド
XAML DataTemplate 内のコントロールに名前で直接アクセスするのは難しい場合があります。 DataTemplate は動的な性質を持っており、その場で要素を作成するため、名前の競合が発生することがよくあります。 これを克服するには、VisualTreeHelper
クラスのような手法を使用して、ビジュアル ツリー (すべての UI 要素の階層構造) をナビゲートする必要があります。
方法 1: 再帰的ビジュアル ツリー トラバーサル
再帰関数はビジュアル ツリーを効率的に探索します。 この例は、すべての子コントロールを検索するための AllChildren
メソッドを示しています。
<code class="language-csharp">public List<Control> AllChildren(DependencyObject parent) { var children = new List<Control>(); for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) { var child = VisualTreeHelper.GetChild(parent, i); if (child is Control control) { children.Add(control); } children.AddRange(AllChildren(child)); } return children; }</code>
このメソッドは、ビジュアル ツリー内で名前によってコントロールを見つけることができます。 たとえば、Image
の選択された項目内で「img1」という名前の FlipView
を検索するには:
MyFlipView.SelectedItem
が null でないことを確認してください。var container = MyFlipView.ItemContainerGenerator.ContainerFromItem(MyFlipView.SelectedItem);
AllChildren(container)
を使用します。Image
を見つけます。方法 2: TemplateParent を活用する
または、TemplatedParent
プロパティを使用して、DataTemplate 内から親コントロールにアクセスします。このアプローチにはヘルパー クラスが必要です:
<code class="language-csharp">public class TemplatedControl<TControl> : ContentControl where TControl : FrameworkElement { public TemplatedControl(TControl control) { Content = control; } public TControl Child => (TControl)Content; }</code>
次に、DataTemplate で次のようにします。
<code class="language-xaml"><datatemplate> <templatedcontrol x:Name="myImage"> <image ... /> </templatedcontrol> </datatemplate></code>
親コントロールの Image
変数を介して myImage
コントロールにアクセスできるようになりました。
どちらの方法も、DataTemplate 内の名前付きコントロールにアクセスするためのソリューションを提供し、データ駆動型 UI をより詳細に制御できるようにします。 コーディング スタイルとプロジェクトの構造に最適な方法を選択してください。
以上がXAML DataTemplate 内のコントロールにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。