2009-11-04 5 views
2

J'ai un DataGrid défini avec WPF Toolkit. Le CellEditingTemplate de ce DataGrid est associé à l'exécution avec une fonction personnalisée qui génère un élément FrameworkElementFactory.Accès au contrôle DataTemplate de WPF Toolkit DataGridCell au moment de l'exécution, comment?

Maintenant, je dois accéder au contrôle qui est inséré dans DataTemplate de CellEditingTempleta, mais je ne sais pas comment faire.

sur le Web, j'ai trouvé un Helper ListView utile ...

public static class ListViewHelper 
{ 
    public static FrameworkElement GetElementFromCellTemplate(ListView listView, Int32 column, Int32 row, String name) 
    { 
     if (row >= listView.Items.Count || row < 0) 
     { 
      throw new ArgumentOutOfRangeException("row"); 
     } 

     GridView gridView = listView.View as GridView; 
     if (gridView == null) 
     { 
      return null; 
     } 

     if (column >= gridView.Columns.Count || column < 0) 
     { 
      throw new ArgumentOutOfRangeException("column"); 
     } 

     ListViewItem item = listView.ItemContainerGenerator.ContainerFromItem(listView.Items[row]) as ListViewItem; 
     if (item != null) 
     { 
      GridViewRowPresenter rowPresenter = GetFrameworkElementByName<GridViewRowPresenter>(item); 
      if (rowPresenter != null) 
      { 
       ContentPresenter templatedParent = VisualTreeHelper.GetChild(rowPresenter, column) as ContentPresenter; 
       DataTemplate dataTemplate = gridView.Columns[column].CellTemplate; 
       if (dataTemplate != null && templatedParent != null) 
       { 
        return dataTemplate.FindName(name, templatedParent) as FrameworkElement; 
       } 
      } 
     } 

     return null; 
    } 

    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; 
    } 
} 

ce travail de code avec l'objet ListView mais pas avec l'objet DataGrid.

Comment utiliser quelque chose comme ça dans DataGrid?

+0

L'accès au contrôle créé par DataTemplate est délicat car il y a très peu de raison de le faire. Qu'est-ce que vous essayez d'accomplir? –

Répondre

0

Nouvelle idée: Au lieu de créer un objet texte dans le DataTemplate, créez une instance d'un contrôle personnalisé que vous créez. Ensuite, placez l'objet texte dans votre contrôle personnalisé et mettez tout le code dont vous avez besoin pour le gérer dans le contrôle personnalisé.

Ancienne idée: Vous devrez effectuer une régression via le VisualTree de DataGrid. Je vous recommande d'espionner votre application au moment de l'exécution avec un programme tel que Snoop puis de modifier l'exemple de code que vous avez fourni pour suivre le bon chemin vers le contrôle qui vous intéresse.

Gardez à l'esprit que c'est difficile parce que ce n'est pas un flux de travail commun. Vous devriez probablement créer des liaisons dans votre DataTemplate à la place.

0

Eh bien, mais je créé un DataTemplate avec ce code ...

var txtStandard = new FrameworkElementFactory(typeof(TextBox)); txtStandard.SetBinding(TextBox.TextProperty, new Binding("Entity")); new DataTemplate { VisualTree = txtStandard }; 

et je dois gérer le txtStandard comme un objet de contrôle; comment peut-on convertir un FrameworkElementFactory en Contrôle?

+0

Vous ne pouvez pas le convertir en contrôle. Pourquoi avez-vous besoin d'y accéder en tant qu'objet de contrôle? Vous pouvez lui donner un contrôle unique. Tapez ensuite sur l'arbre visuel pour trouver un objet avec cette étiquette, mais c'est aussi horrible. Vous liez la propriété Text, pourquoi ne liez-vous pas les autres propriétés aussi? –

Questions connexes