2015-12-21 1 views
3

J'ai un contrôle FlipView avec le DataTemplate défini comme suit:Comment obtenir élément dans le code derrière de DataTemplate

<FlipView x:Name="FlipView5Horizontal" Width="480" Height="270" BorderBrush="Black" BorderThickness="1" Style="{StaticResource FlipViewStyle1}"> 
     <FlipView.ItemTemplate> 
      <DataTemplate> 
      <Grid> 
       <Image Width="480" Name="xxxImage" Height="270" Source="{Binding Image}" Stretch="UniformToFill"/> 
       <Border Name="xxxBorder" Background="#A5000000" Height="80" VerticalAlignment="Bottom"> 
       <TextBlock Name="xxxTB" Text="{Binding Title}" FontFamily="Segoe UI" FontSize="26.667" Foreground="#CCFFFFFF" Padding="15,20"/> 
       </Border> 
      </Grid> 
      </DataTemplate> 
     </FlipView.ItemTemplate> 
     </FlipView> 

Dans mon code derrière, je dois avoir accès au TextBlock nommé « xxxTB ». Voici mon code pour le faire:

public IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
     { 
      if (depObj != null) 
      { 
       for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
       { 
        DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
        if (child != null && child is T) 
        { 
         yield return (T)child; 
        } 

        foreach (T childOfChild in FindVisualChildren<T>(child)) 
        { 
         yield return childOfChild; 
        } 
       } 
      } 
     } 

public void TestMethod() 
{ 
     foreach (var item in FindVisualChildren<TextBlock>(this)) 
     { 
      if (timeLine.Name == "xxxTB") 
      { }      
     } 
} 

Mais, quand il trouve le FlipView dans le VisualTree, il revient de: for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) parce que VisualTreeHelper.GetChildrenCount(depObj) ne retourne rien.

Une idée?

+0

Utilisez 'GetTemplateChild (" xxxTB ")'. –

+0

J'ai essayé, mais il renvoie null. – tavier

+0

Voir ce qui ne va pas aider: http://wpftutorial.net/DataTemplates.html – Bayeni

Répondre

0

Voici donc une solution de travail:

public void TestMethod() 
{ 
    DataTemplate dt = FlipView5Horizontal.ItemTemplate; 
    DependencyObject dio = dt.LoadContent(); 
    foreach (var timeLine in FindVisualChildren<TextBlock>(dio)) //FindVisualTree is defined in the question :) 
    { 
     if (timeLine.Name == "xxxTB") 
     { } 
    } 
} 

Maintenant, je suis en mesure de charger le contrôle d'au moins . (Cependant, j'ai lu que cette astuce ne devrait pas être utilisée dans la méthode surchargée OnApplyTemplate pour une raison quelconque).

2

Essayez cette

ContentPresenter cp = GetFrameworkElementByName<ContentPresenter>(FlipView5Horizontal); 
       DataTemplate dt = FlipView5Horizontal.ItemTemplate; 
       TextBlock l = (dt.FindName("xxxTB", cp)) as TextBlock; 




private static T GetFrameworkElementByName<T>(FrameworkElement referenceElement) where T : FrameworkElement 
      { 
       FrameworkElement child = null; 
       for (Int32 i = 0; i < VisualTreeHelper.GetChildrenCount(referenceElement); i++) 
       { 
        child = VisualTreeHelper.GetChild(referenceElement, i) as FrameworkElement; 
        System.Diagnostics.Debug.WriteLine(child); 
        if (child != null && child.GetType() == typeof(T)) 
        { 
         break; 
        } 
        else if (child != null) 
        { 
         child = GetFrameworkElementByName<T>(child); 
         if (child != null && child.GetType() == typeof(T)) 
         { 
          break; 
         } 
        } 
       } 
       return child as T; 
      } 
+0

Je reçois l'API dt.FindName n'existe pas. – tavier

1

Vous pouvez essayer ceci:

var textblock = IteratingKeyboardChildren(g, keyName); 

Border IteratingKeyboardChildren(Grid g, string keyName) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(g); i++) 
     { 
      var child = VisualTreeHelper.GetChild(g, i); 
      if (child is TextBlock) 
      { 
       if ((child as TextBlock).Tag.ToString().Equals(keyName)) 
        return child as TextBlock ; 
      } 
     } 
     return null; 
    }