void ReatoModificatoHandler(object sender, DatiReatoEventArgs dati_evento)
        {
            // Si rimuove dall'elenco l'oggetto corrispondente al reato da modificare
            nuova_iscrizione_data.Reati_list.Remove((Model.reato) reatoDataGrid.SelectedItem);
            // Si inserisce nell'elenco il reato modificato
            nuova_iscrizione_data.Reati_list.Add(dati_evento.Nuovo_reato);
            // Si aggiornano le associazioni tra il reato e le persone
            foreach (Model.persona p in nuova_iscrizione_data.Persone_indagate_list)
            {
                nuova_iscrizione_data.Persone_reati_ass.RemoveAll(r => r.reato.NomenIuris == dati_evento.Reato_originale.NomenIuris && r.persona.Equals(p));
            }
            foreach (Model.persona p in dati_evento.Persone_indagate_associate)
            {
                Model.PersonaReato ass = new Model.PersonaReato();
                ass.persona = p;
                ass.reato = dati_evento.Nuovo_reato;
                nuova_iscrizione_data.Persone_reati_ass.Add(ass);
            }

            foreach (Model.persona p in nuova_iscrizione_data.Persone_offese_list)
            {
                nuova_iscrizione_data.Persone_reati_ass.RemoveAll(r => r.reato.NomenIuris == dati_evento.Reato_originale.NomenIuris && r.persona.Equals(p));
            }
            foreach (Model.persona p in dati_evento.Persone_offese_associate)
            {
                Model.PersonaReato ass = new Model.PersonaReato();
                ass.persona = p;
                ass.reato = dati_evento.Nuovo_reato;
                nuova_iscrizione_data.Persone_reati_ass.Add(ass);
            }
            // Si aggiorna il data grid contenete l'elenco dei nuovi indagati
            reatoDataGrid.SelectedItem = dati_evento.Nuovo_reato;
            reatoDataGrid.Items.Refresh();
        }
        private void InserisciButtonClick(object sender, RoutedEventArgs e)
        {
            // Si controlla se tutti i dati obbligatori di un reato sono presenti
            if (!reato_binding_source.IsValid)
            {
                MessageBox.Show("Uno o più dati del reato sono mancanti.");
                return;
            }

            // Si impostano alcuni campi del reato, a seconda delle selezioni dell'utente
            Model.tavola_reati reato_selezionato = (Model.tavola_reati)descrizione_reatoComboBox.SelectedItem;
            reato_binding_source.NomenIuris = reato_selezionato.NomenIuris;
            reato_binding_source.Codice = reato_selezionato.Codice;
            reato_binding_source.Descrizione = reato_selezionato.Descrizione;

            // Se il nuovo reato ha un codice già presente nell'elenco dei nuovi reati
            // si mostra un messaggio di errore
            Model.reato find_result_reato;
            find_result_reato = nuova_iscrizione_data.Reati_list.Find(item => item.NomenIuris == reato_binding_source.NomenIuris);
            if (find_result_reato != null)
            {
                if (modalità_modifica == false)
                {
                    MessageBox.Show("Il reato con Nomen Iuris \"" +
                        reato_binding_source.NomenIuris +
                        "\" è già stato inserito.");
                    return;
                }
                else if (find_result_reato.NomenIuris != reato_originale.NomenIuris)
                {
                    MessageBox.Show("Il reato con Nomen Iuris \"" +
                        reato_binding_source.NomenIuris +
                        "\" è già stato inserito.");
                    return;
                }
            }

            DatiReatoEventArgs event_data;
            if (modalità_modifica) event_data = new DatiReatoEventArgs(reato_binding_source, reato_originale);
            else event_data = new DatiReatoEventArgs(reato_binding_source);

            // Si aggiornano le associazioni tra i reati e le persone
            foreach (ReatoIndagati ri in indagati_binding_source)
            {
                if (ri.IsSelected == true)
                {
                    event_data.Persone_indagate_associate.Add(ri.PersonaIndagata);
                }
            }

            foreach (ReatoPO rp in po_binding_source)
            {
                if (rp.IsSelected == true)
                {
                    event_data.Persone_offese_associate.Add(rp.PersonaOffesa);
                }
            }

            // Se si è in modalità modifica si invoca l'evento reato modificato,
            // che verrà gestito dalla pagina "Inserisci reati"
            // Altrimenti si invoca l'evento reato creato, che verrà gestito
            // sempre dalla pagina "Inserisci reati"
            if (modalità_modifica)
                On_evento_reato_modificato(event_data);
            else
                On_evento_reato_creato(event_data);
            Close();
        }
        void ReatoCreatoHandler(object sender, DatiReatoEventArgs dati_evento)
        {
            // Si aggiunge il reato nelle informazioni sulla nuova iscrizione
            nuova_iscrizione_data.Reati_list.Add(dati_evento.Nuovo_reato);
            // Si creano le associazioni tra il reato e le persone associate
            foreach (Model.persona p in dati_evento.Persone_indagate_associate)
            {
                Model.PersonaReato ass = new Model.PersonaReato();
                ass.persona = p;
                ass.reato = dati_evento.Nuovo_reato;
                nuova_iscrizione_data.Persone_reati_ass.Add(ass);
            }

            foreach (Model.persona p in dati_evento.Persone_offese_associate)
            {
                Model.PersonaReato ass = new Model.PersonaReato();
                ass.persona = p;
                ass.reato = dati_evento.Nuovo_reato;
                nuova_iscrizione_data.Persone_reati_ass.Add(ass);
            }
            // Si aggiorna il data grid contenete l'elenco dei nuovi indagati
            reatoDataGrid.SelectedItem = dati_evento.Nuovo_reato;
            reatoDataGrid.Items.Refresh();
        }
 protected virtual void On_evento_reato_modificato(DatiReatoEventArgs e)
 {
     if (evento_reato_modificato != null) evento_reato_modificato(this, e);
 }