Laden...

Databinding zwischen controls, mit benutzerdefinierten Konvertern

Erstellt von ErfinderDesRades vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.982 Views
ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 14 Jahren
Databinding zwischen controls, mit benutzerdefinierten Konvertern

Häufig will man controls enablen/disablen oder hiden/showen, je nach Datenlage oder auch Zustand der Controls untereinander.

Kein Problem, man kann auch Control-Properties mit Databinding verknüppern.
Bes. interessant auch die beiden events der Binding-Klasse: Format und Parse.

Format wird ausgelöst, wenn die Daten ins Control geschrieben werden (zB nach einer Daten-Äderung)
Parse wird ausgelöst, wenn das Control ausgelesen wird, um die Daten zu updaten (zB nach einer Eingabe)

Bes häufig will man das eine Control enabled, das andere disabled. Einfaches Databinding würde die beiden gleichschalten, daher muß man og. Events nutzen, um den Wert grad immer umzudrehen.
Hier mal der Code:

using System;
using System.Windows.Forms;

namespace InverseBinding {

   public partial class Form1 : Form {
      public Form1() {
         InitializeComponent();
         button1.Click += (s, e) => ToggleButton1Enabled();
         button2.Click += (s, e) => ToggleButton1Enabled();

         //button1.Enabled und button2.Enabled invertiert verknüpfen
         var bnd = button2.DataBindings.Add("Enabled", button1, "Enabled");
         bnd.Format += bnd_Invert;
         bnd.Parse += bnd_Invert;

         //spaßeshalber noch ein panel dran hängen
         panel1.DataBindings.Add(new Binding("Enabled", button2, "Enabled"));

         //button1.Enabled auch mit einer Textbox verknüpfen, aber mit benutzerdefiniertem 
         //Text für true/false
         var bnd2 = textBox1.DataBindings.Add("Text", button1, "Enabled");
         bnd2.Format += new ConvertEventHandler(bnd2_Format);
      }

      void bnd_Invert(object sender, ConvertEventArgs e) {
         // invertiert den bool, sowohl beim parsen (Control auslesen)
         // als auch beim formatten (Control befüllen)
         e.Value = !(bool)e.Value;
      }

      void bnd2_Format(object sender, ConvertEventArgs e) {
         // ersetzt die Konvertierung des standard-TypeConverters durch eine benutzerdefinierte
         // beachte: da das parsen hier nicht implementiert ist, muß man "True"/"False" reinschreiben,
         // um wirkung zu erzielen
         e.Value = ((bool)e.Value) ? "eher schon" : "tendenziell eher weniger";
      }

      private void ToggleButton1Enabled() {
         button1.Enabled = !button1.Enabled;
      }
   }
}


Der frühe Apfel fängt den Wurm.