Come accedere al testo della casella di testo della colonna del modello DataGrid WPF C #

Ho bisogno di accedere al testo in una colonna del modello DataGrid dal codice sottostante, ma non so come. Ho bisogno di cambiare il testo in qualsiasi stringa che passo ad esso nell’evento SelectionChanged . Qualcuno può dirmi come ottenere ciò? Ho trovato una domanda simile qui ma non ha avuto risposte.

Per trovare un controllo in una colonna di template DataGrid , dovresti usare FindChild() :

  public static T FindChild(DependencyObject parent, string childName) where T : DependencyObject { if (parent == null) { return null; } T foundChild = null; int childrenCount = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < childrenCount; i++) { var child = VisualTreeHelper.GetChild(parent, i); T childType = child as T; if (childType == null) { foundChild = FindChild(child, childName); if (foundChild != null) break; } else if (!string.IsNullOrEmpty(childName)) { var frameworkElement = child as FrameworkElement; if (frameworkElement != null && frameworkElement.Name == childName) { foundChild = (T)child; break; } else { foundChild = FindChild(child, childName); if (foundChild != null) { break; } } } else { foundChild = (T)child; break; } } return foundChild; } 

Ad esempio, ho questa colonna modello in MyDataGrid :

           

Accedici dal codice, puoi:

 TextBlock MyTextBlock = FindChild(MyDataGrid, "MyTextBlock"); MessageBox.Show(MyTextBlock.Text); 

Nota: Usa sempre FindChild solo quando il controllo sarà completamente caricato, altrimenti non lo troverà e darà null. In questo caso, inserisco questo codice nell’evento ContentRendered (Window) che dice che tutto il contenuto della finestra viene caricato correttamente (anche l’evento MyDataGrid_Loaded non ha accesso a MyTextBlock, perché non è ancora stato caricato):

  private void Window_ContentRendered(object sender, EventArgs e) { TextBlock MyTextBlock = FindChild(MyDataGrid, "MyTextBlock"); MessageBox.Show(MyTextBlock.Text); } 

Edit1:

Per accedere al controllo della riga selezionata per aggiungere l’evento SelectionChanged a DataGrid in cui funzionare, che darà una riga selezionata:

  private void MyDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { try { var row_list = GetDataGridRows(MyDataGrid); foreach (DataGridRow single_row in row_list) { if (single_row.IsSelected == true) { TextBlock MyTextBlock = FindChild(single_row, "MyTextBlock"); MessageBox.Show(MyTextBlock.Text); } } } catch { throw new Exception("Can't get access to DataGridRow"); } } 

Elenco di GetDataGridRows ():

  public IEnumerable GetDataGridRows(DataGrid grid) { var itemsSource = grid.ItemsSource as IEnumerable; if (null == itemsSource) { yield return null; } foreach (var item in itemsSource) { var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow; if (null != row) { yield return row; } } } 

EDIT2:

Per ottenere TUTTI gli elementi ho riscritto la funzione FindChild ():

  public static void FindChildGroup(DependencyObject parent, string childName, ref List list) where T : DependencyObject { // Checks should be made, but preferably one time before calling. // And here it is assumed that the programmer has taken into // account all of these conditions and checks are not needed. //if ((parent == null) || (childName == null) || ()) //{ // return; //} int childrenCount = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < childrenCount; i++) { // Get the child var child = VisualTreeHelper.GetChild(parent, i); // Compare on conformity the type T child_Test = child as T; // Not compare - go next if (child_Test == null) { // Go the deep FindChildGroup(child, childName, ref list); } else { // If match, then check the name of the item FrameworkElement child_Element = child_Test as FrameworkElement; if (child_Element.Name == childName) { // Found list.Add(child_Test); } // We are looking for further, perhaps there are // children with the same name FindChildGroup(child, childName, ref list); } } return; } 

Chiamando questa nuova funzione:

  private void Window_ContentRendered(object sender, EventArgs e) { // Create the List List list = new List(); // Find all elements FindChildGroup(MyDataGrid, "MyTextBlock", ref list); string text = ""; // Print foreach (TextBlock elem in list) { text += elem.Text + "\n"; } MessageBox.Show(text, "Text in TextBlock"); } 

Generalmente, questa pratica non è la migliore … per ottenere gli elementi (come tutti o selezionati), è ansible contattare direttamente l’elenco che memorizza i dati (come ObservableCollection ). Inoltre, sono eventi utili come PropertyChanged .