Domanda

Sto usando il seguente codice nel mio ViewModel alle voci di cancellazione su una collezione:

UnitMeasureCollection.CollectionChanged += new NotifyCollectionChangedEventHandler(ListOfUnitMeasureCollectionChanged);

void ListOfUnitMeasureCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.Action == NotifyCollectionChangedAction.Remove)
    {
        if (NavigationActions.DeleteConfirmation("Delete Item.", "Are you sure you want to delete this item? This action cannot be undone."))
        {
            foreach (UnitMeasureBO item in e.OldItems)
            {
                UnitMeasureBO unitMeasureBO = item as UnitMeasureBO;
                bool inUse = unitMeasureRepository.UnitMeasureInUse(unitMeasureBO.UnitMeasureValue);
                if (inUse == true)
                {
                    NavigationActions.ShowError("Cannot delete item", "This item cannot be deleted because it is used elsewhere in the application.");
                }
                else
                {
                    unitMeasureRepository.DeleteUnitMeasure(unitMeasureBO.UnitMeasureValue);
                }
            }
        }
    }
}

Ho un datagrid che è legato alla raccolta. Mi chiedo se v'è comunque di annullare l'azione di rimozione in base alla richiesta di conferma? Ho notato NotifyCollectionChangedEventArgs non dispone di un metodo di annullare. Ciò che accade è quando un utente elimina un elemento da datagrid ma sceglie 'no' alla conferma, l'elemento viene ancora rimosso dalla datagrid. Non viene eliminato dal database e se il DataGrid viene aggiornato apparirà di nuovo. Sto usando il modello MVVM e preferisco fare questo senza dover codificare il mio datagrid. Ogni aiuto è apprezzato.

È stato utile?

Soluzione

Beh, non è possibile annullare un'azione di rimozione durante un evento CollectionChanged.

Il mio suggerimento: se si sta utilizzando MVVM, si dovrebbe avere una qualche parte DeleteCommand che si attiva quando si preme il DeleteKey nel DataGrid. Nel metodo execute () di questo comando, è necessario:

  1. Fai la conferma.
  2. Se l'utente sceglie di sì, quindi rimuovere l'elemento dalla raccolta. Questa rimozione dovrebbe direttamente riflettersi sulla DataGrid.
  3. Se sceglie utente no, non fanno nulla.

Questo significa però che i DataGrid.CanUserDeleteRows è impostata su False poiché è necessario fondamentalmente per controllare quando le righe vengono eliminati.

Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top