10
votes

Code pour vérifier si une cellule d'un DataGrid est actuellement modifiée

Y a-t-il une possibilité simple de vérifier si le DataGrid est actuellement en EditMode (sans se souscrivrer au lancement et à la celluleditendant)


0 commentaires

4 Réponses :


6
votes

OK, je n'ai pas trouvé une solution simple et personne ne m'a pointé un. Le code suivant peut être utilisé pour ajouter une propriété connectée IsineDitmode à un DataGrid. J'espère que cela aide quelqu'un:

<DataGrid local:DataGridIsInEditModeTracker.ProcessIsInEditMode="True" ..  other properties ..>


4 commentaires

Génial, merci, pour mon avis, vous devez publier ceci lors d'une connexion à Microsoft et publier ici un lien pour que l'utilisateur puisse voter pour qu'il soit mis en œuvre dans la version à venir.


Je suggérerais de remplacer les paramètres de l'OBJ de dépendanceProperty avec DataGrid DG, de sorte que la propriété connectée ne peut donc être appliquée que sur des objets de type DataGrid.


Comment puis-je vous assurer que le gestionnaire de ce comportement est atteint avant que d'autres gestionnaires déclarés dans XAML, etc.?


Je l'ai trouvé, c'est simple, j'utilise l'événement de préparationCellforedit, qui est soulevé après l'événement du lancement.



3
votes

J'ai trouvé une solution de contournement plus courte (vb.net/c#):

vb.net

public static TContainer GetContainerFromIndex<TContainer>
  (this ItemsControl itemsControl, int index)
    where TContainer : DependencyObject
{
  return (TContainer)
    itemsControl.ItemContainerGenerator.ContainerFromIndex(index);
}

public static bool IsEditing(this DataGrid dataGrid)
{
  return dataGrid.GetEditingRow() != null;
}

public static DataGridRow GetEditingRow(this DataGrid dataGrid)
{
  var sIndex = dataGrid.SelectedIndex;
  if (sIndex >= 0)
  {
    var selected = dataGrid.GetContainerFromIndex<DataGridRow>(sIndex);
    if (selected.IsEditing) return selected;
  }

  for (int i = 0; i < dataGrid.Items.Count; i++)
  {
    if (i == sIndex) continue;
    var item = dataGrid.GetContainerFromIndex<DataGridRow>(i);
    if (item.IsEditing) return item;
  }

  return null;
}


2 commentaires

Parfois, GetContainerFromindex ne renvoie pas une valeur. Je ne sais pas si cela a quelque chose à voir avec des articles virtuels / non créés. Par conséquent, point.istiting dans GeetItIdItRow provoque une nullreferenceException. Mais peu importe; C'est quelque chose de mineur et vous avez résolu mon problème: +1


@Markus devriez-vous jamais trouver une SLN à cela s'il vous plaît buzz dans



13
votes

Il semble que vous puissiez également obtenir ces informations à partir de la vue Éléments, à savoir ces travaux:

IEditableCollectionView itemsView = stateGrid.Items;
if (itemsView.IsAddingNew || itemsView.IsEditingItem)
{
    stateGrid.CommitEdit(DataGridEditingUnit.Row, true);
}


1 commentaires

Il est plus sûr d'obtenir des articlesView à l'aide de Collectionviewsource.getDefaultView (StatGrid.items) Source



0
votes

Toutes les réponses ci-dessus à l'aide de l'iseDiting sur le DataGridrow ou IsediTitangitem sur l'IEDITABLECollection sont des réponses partielles à moi:

Si l'utilisateur entrez édition, puis des clics sur une autre cellule, l'événement Endedit est tiré mais le DataGridrow a toujours le Property Isditing to True !!! Et si vous essayez de trouver le DataGridCell responsable, sa iSeditingProperty est toujours fausse ... Je pense que c'est un bug. Et d'avoir le comportement souhaité, je devais écrire cette solution laid de contournement laide xxx

Ceci forcer la grille pour définir ISediting = False sur le DataGridrow, lorsque toute cellule cesse d'éditer. < / p>


0 commentaires