bool possoCambiareStatus(DataEntryStatus nuovoStatus)
        {
            bool posso = false;

            if (nuovoStatus == status)
            {
                return(false);                 // Che senso ha ?? esco subito.
            }
            switch (nuovoStatus)
            {
            case DataEntryStatus.New:
                posso = status == DataEntryStatus.View;
                break;

            case DataEntryStatus.Edit:
                posso = collectionView.CurrentItem != null && status == DataEntryStatus.View;
                break;

            case DataEntryStatus.Delete:
                posso = collectionView.CurrentItem != null && collectionView.CanRemove && status == DataEntryStatus.View;
                break;

            case DataEntryStatus.View:
                posso = true;
                break;
            }

            return(posso);
        }
        void cambiareStatus(DataEntryStatus nuovoStatus)
        {
            if (!possoCambiareStatus(nuovoStatus))
            {
                throw new ArgumentException("nuovo stato incompatibile: " + nuovoStatus);
            }

            // Eseguo!
            switch (nuovoStatus)
            {
            case DataEntryStatus.View:
                if (collectionView.IsEditingItem && collectionView.CanCancelEdit)
                {
                    collectionView.CancelEdit();
                }
                if (collectionView.IsAddingNew)
                {
                    collectionView.CancelNew();
                }
                break;

            case DataEntryStatus.Edit:
                passoPreparaEdit(entitaCorrente);
                collectionView.EditItem(entitaCorrente);
                break;

            case DataEntryStatus.New:
                System.Diagnostics.Debug.Assert(collectionView.CanAddNew);
                TEntity nuova = (TEntity)collectionView.AddNew();
                passoPreparaAddNew(nuova);

                // Purtroppo i campi che sono a video non si rinfrescano con i valori di default.
                // Per ovviare, mi devo spostare e poi ritornare sul nuovo record.
                collectionView.MoveCurrentToFirst();
                collectionView.MoveCurrentTo(nuova);
                break;

            case DataEntryStatus.Delete:
                cancella(entitaCorrente);
                nuovoStatus = DataEntryStatus.View;
                break;
            }

            status = nuovoStatus;
        }
        bool possoCambiareStatus(string nomeNuovoStatus)
        {
            DataEntryStatus nuovoStatus = (DataEntryStatus)Enum.Parse(typeof(DataEntryStatus), nomeNuovoStatus);

            return(possoCambiareStatus(nuovoStatus));
        }
        void cambiareStatus(string nomeNuovoStato)
        {
            DataEntryStatus nuovoStatus = (DataEntryStatus)Enum.Parse(typeof(DataEntryStatus), nomeNuovoStato);

            cambiareStatus(nuovoStatus);
        }