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:
- 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:
- Crea una classe ViewModel che rispecchi la struttura dell'oggetto originale.
- Copia i dati dall'oggetto originale al ViewModel al caricamento della form.
- Effettua il binding dei controlli della form alle proprietà del ViewModel.
- Quando l'utente preme "Salva", **copia i dati dal ViewModel all'oggetto originale.
- 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();
}
}
- 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:
- Crea una copia dell'oggetto originale.
- Effettua il binding della form alla copia.
- Se l'utente preme "Salva", trasferisci i dati dalla copia all'oggetto originale.
- 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.