1

My View possède une collection de UserControls (définie dans ItemTemplate d'ItemsControl), et je souhaite obtenir des références à ceux-ci.Comment obtenir le contrôle de ItemTemplate dans ItemsControl?

J'utilise ItemContainerGenerator.ContainerFromIndex, mais il retourne ContentPresenter, alors que je devrais obtenir mon type UserControl, PlotterColetaCanalUnico. Comment devrais-je faire ça?

Xaml:

 <ItemsControl x:Name="plotter" ItemsSource="{Binding Sinais}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <UniformGrid Columns="1" IsItemsHost="True"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Border x:Name="upper_light_border" BorderThickness="1,0,0,0" BorderBrush="#FFE5E5E5" SnapsToDevicePixels="True"> 
         <Border x:Name="lower_dark_border" BorderThickness="0,0,0,1" BorderBrush="#FF1A1A1A" SnapsToDevicePixels="True"> 
          <local:PlotterColetaCanalUnico/> 
         </Border> 
        </Border> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

code derrière:

IEnumerable<PlotterColetaCanalUnico> SubPlotters 
    { 
     get 
     { 
      var plotters = new List<PlotterColetaCanalUnico>(); 

      for(int i = 0; i < plotter.Items.Count; i++) 
      { 
       var container = (UIElement)plotter 
           .ItemContainerGenerator 
           .ContainerFromIndex(i); 

       // "container" ends up being ContentPresenter, 
       // so the following cast does not work! 
       var subPlotter = container as PlotterColetaCanalUnico; 

       if (subPlotter != null) 
       { 
        plotters.Add(subPlotter); 
       } 
      } 

      return plotters; 
     } 
    } 

J'ai eu à travailler en fonction de la réponse acceptée, et les modifications suivantes:

Xaml - a ajouté un nom à UserControl:

<local:PlotterColetaCanalUnico x:Name="plotterCanal"/> 

code derrière - a cherché le UserControl directement (sans avoir recours à VisualTreeHelper comme le suggère la réponse):

   if (container == null) 
        continue; 

       var template = container.ContentTemplate; 
       var subPlotter = template.FindName("plotterCanal", container) as PlotterColetaCanalÚnico; 

Répondre

1

Vous devez creuser dans l'arbre visuel un peu plus pour trouver votre contrôle

if (container != null) 
{ 
    var template = container.ContentTemplate; 
    var border = template.FindName("upper_light_border", container) as Border; 
    // From here, use VisualTreeHelper.GetChild to dig down in to the visual tree and find your control. 

} 

vous pouvez utiliser cette réponse ici pour faire une méthode d'aide pour traverser l'arbre: https://stackoverflow.com/a/1759923/1231132

+0

pensez-vous que je pourrais ajouter un 'x: nAME' au UserControl Je veux trouver, et y accéder directement sans utiliser VisualTreeHelper? – heltonbiker

+0

Peu importe, j'ai essayé ce que j'ai suggéré et cela a fonctionné. De toute façon, ta réponse a fait l'affaire, merci !! – heltonbiker

+0

De rien! Et désolé pour le commentaire paresseux que j'ai laissé sur votre question plus tôt. – WasGoodDone