Vb, Net 6 e binding tra controlli e oggetti

maurizio bianchella 0 Punti di reputazione
2024-05-16T09:52:53.1466667+00:00

Buongiorno a tutti,

dopo un po' di tempo speso tutto a portare avanti dei progetti datati, ho ripreso in mano una cosetta WinForm che stavo scrivendo in .Net 6. Ho una classe con delle proprietà, in una form ho dei campi di testo, e sto facendo il binding tra alcune proprietà di questa classe con i textbox presenti sulla form.

Quello che vorrei è che, nel caricare la form, venissero mostrati i dati dell'oggetto a cui il binding punta, e fin qui, tutto ok.

Naturalmente, cambiando poi il testo in un textbox, cambia il valore della proprietà dell'oggetto associata. Quello che vorrei fare, però, è cambiare la proprietà dell'oggetto solo se poi effettivamente confermo la volontà di cambiare, insomma, i classici pulsantini presenti nelle form "Salva" e "Annulla". Salvando, prendo il contenuto di tutte le textbox e lo passo alle rispettive proprietà dell'oggetto, mentre facendo annulla, non ho cambiato niente.

Per evitare di trasferire i dati dalle textbox alle proprietà, posso certamente impostare, nel binding della textbox, la modalità di aggiornamento origine dati come "Mai", ma poi?

Aggiorno manualmente tutte le proprietà andando a vedere testo per testo il contenuto e passandolo alle proprietà corrispondenti?

Perderei il vantaggio di lavorare in binding.

Mi faccio una copia dell'oggetto originale, e premendo il tasto "Annulla" ripristino l'originale? Boh, mi sembra un lavoro lungo.

Tra l'altro, se non sbaglio, già tempo fa avevo fatto una cosa di simile, aiutato anche da una domanda simile che avevo fatto sul vecchio forum MSDN, ma quella roba li è sparita e non la trovo neanche come archivio, da qualche parte.

Grazie e buona giornata

VB
VB
Linguaggio di programmazione orientato agli oggetti sviluppato da Microsoft implementato in .NET Framework. Precedentemente noto come Visual Basic .NET.
15 domande
0 commenti Nessun commento
{count} voti

2 risposte

Ordina per: Più utili
  1. Monica Caprio (Convergys International Europe) 890 Punti di reputazione Fornitore Microsoft
    2024-05-17T09:40:25.36+00:00

    Gentile Maurizio,

    Per gestire il binding dei controlli di una form Windows Forms in modo che le modifiche vengano applicate solo al momento della conferma (con pulsanti "Salva" e "Annulla"), puoi seguire una delle seguenti strategie:

    1. Uso di una Classe ViewModel

    Puoi creare una classe ViewModel che copia i dati dall'oggetto originale. La form lavora con il ViewModel, e solo quando l'utente preme "Salva" trasferisci i dati dal ViewModel all'oggetto originale.

    Passi da seguire:

    1. Crea una classe ViewModel che rispecchi la struttura dell'oggetto originale.
    2. Copia i dati dall'oggetto originale al ViewModel al caricamento della form.
    3. Effettua il binding dei controlli della form alle proprietà del ViewModel.
    4. Quando l'utente preme "Salva", **copia i dati dal ViewModel all'oggetto originale.
    5. Se l'utente preme "Annulla", semplicemente chiudi la form senza trasferire i dati.

    Esempio:

    
    public class MyObject
    
    {
    
        public string Property1 { get; set; }
    
        public int Property2 { get; set; }
    
        // altre proprietà
    
    }
    
    public class MyViewModel
    
    {
    
        public string Property1 { get; set; }
    
        public int Property2 { get; set; }
    
        // altre proprietà
    
        public void CopyFrom(MyObject source)
    
        {
    
            Property1 = source.Property1;
    
            Property2 = source.Property2;
    
            // copia altre proprietà
    
        }
    
        public void CopyTo(MyObject destination)
    
        {
    
            destination.Property1 = Property1;
    
            destination.Property2 = Property2;
    
            // copia altre proprietà
    
        }
    
    }
    
    

    Nel form:

    
    public partial class MyForm : Form
    
    {
    
        private MyObject _originalObject;
    
        private MyViewModel _viewModel;
    
        public MyForm(MyObject obj)
    
        {
    
            InitializeComponent();
    
            _originalObject = obj;
    
            _viewModel = new MyViewModel();
    
            _viewModel.CopyFrom(_originalObject);
    
            this.DataContext = _viewModel; // Binding al ViewModel
    
        }
    
        private void btnSalva_Click(object sender, EventArgs e)
    
        {
    
            _viewModel.CopyTo(_originalObject);
    
            this.DialogResult = DialogResult.OK;
    
            this.Close();
    
        }
    
        private void btnAnnulla_Click(object sender, EventArgs e)
    
        {
    
            this.DialogResult = DialogResult.Cancel;
    
            this.Close();
    
        }
    
    }
    
    
    1. Binding Temporaneo:

    Puoi usare il binding temporaneo con un oggetto di backup. Al caricamento della form, crei una copia dell'oggetto e fai il binding a questa copia. Se l'utente conferma, trasferisci i dati dalla copia all'oggetto originale.

    Passi da seguire:

    1. Crea una copia dell'oggetto originale.
    2. Effettua il binding della form alla copia.
    3. Se l'utente preme "Salva", trasferisci i dati dalla copia all'oggetto originale.
    4. Se l'utente preme "Annulla", chiudi la form senza trasferire i dati.

    Esempio:

    
    public partial class MyForm : Form
    
    {
    
        private MyObject _originalObject;
    
        private MyObject _tempObject;
    
        public MyForm(MyObject obj)
    
        {
    
            InitializeComponent();
    
            _originalObject = obj;
    
            _tempObject = new MyObject
    
            {
    
                Property1 = _originalObject.Property1,
    
                Property2 = _originalObject.Property2,
    
                // copia altre proprietà
    
            };
    
            this.DataContext = _tempObject; // Binding all'oggetto temporaneo
    
        }
    
        private void btnSalva_Click(object sender, EventArgs e)
    
        {
    
            _originalObject.Property1 = _tempObject.Property1;
    
            _originalObject.Property2 = _tempObject.Property2;
    
            // trasferisci altre proprietà
    
            this.DialogResult = DialogResult.OK;
    
            this.Close();
    
        }
    
        private void btnAnnulla_Click(object sender, EventArgs e)
    
        {
    
            this.DialogResult = DialogResult.Cancel;
    
            this.Close();
    
        }
    
    }
    
    

    Considerazioni Finali:

    Entrambi gli approcci ti permettono di gestire le modifiche in modo più pulito e mantenere il vantaggio del binding. L'approccio del ViewModel può risultare più strutturato e flessibile, soprattutto in applicazioni più grandi o complesse. L'approccio del binding temporaneo può essere più semplice e diretto in situazioni meno complesse.

    Scegli l'approccio che meglio si adatta alle tue esigenze e alla complessità del tuo progetto.

    Spero che ti sia stata utile la mia risposta.

    Monica.

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento

  2. maurizio bianchella 0 Punti di reputazione
    2024-05-17T10:08:36.5033333+00:00

    Monica,

    come prima cosa, grazie della risposta.

    In realtà i suggerimenti che proponi, li avevo già presi in considerazione, magari con qualche dettaglio differente, ma siamo li.

    Quello che volevo evitare era proprio il raddoppiare il lavoro.

    L'approccio che ho sempre utilizzato, almeno in WinForm, è:

    Dichiaro la form, assegno ad una proprietà di questa form l'oggetto di cui voglio visualizzare i dati, poi nell'evento load della form stessa (se prevedo di usarla in modalità showdialog) passo alla proprietà Text di ogni TextBox (o quel che sia, cambia poco), il valore della proprietà dell'oggetto che voglio visualizzare.

    Se poi premo su "Salva", ad ogni proprietà dell'oggetto che ha li corrispettivo TextBox, assegno il valore preso dal testo.

    Mi sembra un approccio un po', diciamo così, infantile.

    Ma se devo costruire una form con i controlli in binding, e poi comunque copiare i dati da un oggetto ad un altro, che sia un modelview o che sia una copia di backup, non riesco a vedere il vantaggio rispetto all'approccio che ho sempre avuto, anzi, oltre a scrivere i metodi di copia da un oggetto all'altro, devo anche andare a dare ad ogni controllo le informazioni per il binding, lavoro che non dovrei fare passando manualmente i valori alle proprietà.