2010-11-11 5 views
2

Est-il possible d'accéder aux éléments dans DataTemplate dans le code? Je veux dire, je l'ai DataTemplate défini dans Window.Resources comme ceci:Est-il possible d'accéder aux éléments dans DataTemplate dans le code?

<Window.Resources> 
    <DataTemplate x:Key="MyTemplate" DataType="MyType"> 
     <StackPanel Orientation="Horizontal" Height="Auto" Tag="ColorString"> 
      <Rectangle Width="16" Height="14" Margin="2,1" VerticalAlignment="Center" Stroke="Red"> 
       <Rectangle.Fill> 
        <SolidColorBrush Color="{Binding Path=FillColor}"/> 
       </Rectangle.Fill> 
      </Rectangle> 
      <TextBlock VerticalAlignment="Center" Text="{Binding Path=Value}"/> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 

J'ai besoin de définir certaines propriétés du rectangle dans le code. Comment puis-je faire ceci? Lorsque DataTemplate est chargé, son VisualTree est null.

Répondre

0

Vous pouvez ajouter l'événement Loaded au StackPanel et au code derrière.

private void StackPanel_Loaded(object sender, RoutedEventArgs e) 
{ 
    StackPanel stackPanel = sender as StackPanel; 
    Rectangle rectangle = GetVisualChild<Rectangle>(stackPanel) as Rectangle; 
    //.. 
} 

Cela n'affectera le DataTemplate lui-même, mais à chaque fois qu'il est utilisé, StackPanel_Loaded sera appelée.

Une mise en œuvre de GetVisualChild ..

public static T GetVisualChild<T>(object parent) where T : Visual 
{ 
    DependencyObject dependencyObject = parent as DependencyObject; 
    return InternalGetVisualChild<T>(dependencyObject); 
} 
private static T InternalGetVisualChild<T>(DependencyObject parent) where T : Visual 
{ 
    T child = default(T); 
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < numVisuals; i++) 
    { 
     Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
     child = v as T; 
     if (child == null) 
     { 
      child = GetVisualChild<T>(v); 
     } 
     if (child != null) 
     { 
      break; 
     } 
    } 
    return child; 
}