2017-06-29 6 views
-1

J'utilise cette méthode pour énumérer tous les boutons d'un usercontrol:VisualTreeHelper ne trouve pas le contrôle dans DataGridTemplateColumn.CellTemplate

private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
{ 
    if (depObj != null) 
    { 
     int NbChild = VisualTreeHelper.GetChildrenCount(depObj); 

     for (int i = 0; i < NbChild; i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 

      if (child != null && child is T) 
      { 
       yield return (T)child; 
      } 

      foreach (T childNiv2 in FindVisualChildren<T>(child)) 
      { 
       yield return childNiv2; 
      } 
     } 
    } 
} 
public static void ImplementShortCut(ContentControl page) 
{ 
    List<Button> ListButton = new List<Button>(); 
    ListButton = FindVisualChildren<Button>(page).ToList(); 
    .... 
} 

Il fonctionne bien à l'exception des boutons à l'intérieur DataGridTemplateColumn.CellTemplate

<DataGridTemplateColumn>      
<DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <StackPanel> 
      <Button x:Name="Btn_Edit" 
        Click="Btn_EditTest_Click"/> 
     </StackPanel> 
    </DataTemplate> 
</DataGridTemplateColumn.CellTemplate> 

'VisualTreeHelper.GetChild' faire Il ne semble pas être capable de trouver les contrôles dans les éléments de DataGrid.

+0

Devrait fonctionner. Qu'est-ce que "page" et où appelez-vous la méthode? – mm8

+0

'page' est un UserControl, la méthode est appelée dans la méthode load (TestPage_Loaded), Elle-même appelée dans le constructeur de 'page' (this.Loaded + = TestPage_Loaded;) Mais je n'ai aucun problème pour le bouton en dehors de la grille de données! ! – Alematt

+0

C'est incompréhensible ... s'il vous plaît poster votre code. Le DataGrid est-il situé dans la "page"? – mm8

Répondre

0

Ma classe

public class ShortCutUtils 
{ 
    public static void ImplementShortCut(ContentControl page) 
    { 
    List<Button> ListButton = new List<Button>(); 
    ListButton = FindVisualChildren<Button>(page).ToList(); 
     ... 
    } 


private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
{ 
if (depObj != null) 
    { 
    int NbChild = VisualTreeHelper.GetChildrenCount(depObj); 

    for (int i = 0; i < NbChild; i++) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 

     if (child != null && child is T) 
     { 
      yield return (T)child; 
     } 

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

PageTest XAML

  <DataGrid Grid.Row="0" x:Name="Dg_Test" 
       Margin="2" 
       AutoGenerateColumns="False" 
       SelectedCellsChanged="dg_Test_SelectionChanged" 
       SelectionMode="Single" 
       MouseLeftButtonDown="Dg_TestMouseClick" 
       RowDetailsVisibilityMode="{Binding RowDetailsVisible}" 
       ScrollViewer.VerticalScrollBarVisibility="Visible" 
       Style="{StaticResource DatagridDesktopStyle}"> 

       <DataGrid.Columns> 
        ... 
        <DataGridTemplateColumn Width="auto" IsReadOnly="True" Header=""> 
         DataGridTemplateColumn.HeaderTemplate> 
         ... 
         </DataGridTemplateColumn.HeaderTemplate> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <StackPanel> 
            <Button x:Name="Btn_Edit" 
              Click="Btn_EditTest_Click"/> 
           </StackPanel> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
       </DataGrid.Columns> 
     </DataGrid> 

PageTest code

public partial class TestPage : UserControl 
{ 
    public TestPage() 
    { 
    InitializeComponent(); 
    this.Loaded += TestListPage_Loaded; 
    this.DataContext = this; 
    } 


    private async void TestListPage_Loaded(object sender, RoutedEventArgs e) 
    { 
    ShortCutUtils.ImplementShortCut(this); 
    } 
} 
0

Comme supposé swiszcz, toutes les commandes ne sont pas fini d'être chargés lors de l'appel des 'ShortCutUtils .ImplementShortCut (t sa) 'méthode à la fin de' charge '. Pour remédier à cela, je place donc cette méthode dans une faible priorité « Invoke »

Application.Current.Dispatcher.Invoke(() => 
{ShortCutUtils.ImplementShortCut (this); 
}, DispatcherPriority.Render); 

Et cela fonctionne très bien! Merci beaucoup