Laden...

Databinding Problem mit ConfigurationSection

Erstellt von Sarc vor 15 Jahren Letzter Beitrag vor 15 Jahren 977 Views
S
Sarc Themenstarter:in
417 Beiträge seit 2008
vor 15 Jahren
Databinding Problem mit ConfigurationSection

Hallo,

ich habe ein Configurationsobjekt, welches von ConfigurationSection ableitet und
welches ich mittels Databinding an ein ToolStripMenuItem binden möchte. (Die Databinding Funktionalität habe ich per IBindableComponent implementiert)

Binding sieht etwa so aus:


myItem.DataBindings.Add( new Binding( "Checked", myConfigSection, "IsChecked" ) );

Meine ConfigSection sieht auszugsweise so aus:


public class MyConfigSection : ConfigurationSection, INotifyPropertyChanged
{
	public event PropertyChangedEventHandler PropertyChanged;

	[ConfigurationProperty( "IsChecked" )]
	public bool IsChecked
	{
	get { return (bool)base["IsChecked"]; }
	set
	{
		if( value != this.IsChecked )
		{
			base["IsChecked"] = value;
			
			if( this.PropertyChanged != null )
				this.PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
		}
	}
}
}

Damit funktioniert das Databinding nicht, d.h. wenn sich der bool Wert ändert, bleibt die Checked-Eigenschaft des MenuItems unverändert.
Der PropertyChanged Event wird aber gefeuert, d.h. normalerweise müsste das Databinding sich jetzt einschalten.

Nehme ich jedoch statt dem obigen Property ein "normales" Property, dann funktioniert das Databinding:


private bool isChecked;

public bool IsChecked
{
	get { return isChecked; }
	set
	{
		if( value != this.IsChecked )
		{
			isChecked = value;
			
			if( this.PropertyChanged != null )
				this.PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
		}
	}
}

Sobald ich jedoch in den Setter etwas aus der ConfigurationSection aufrufe funktioniert es nicht mehr, z.b.:


private bool isChecked;

public bool IsChecked
{
	get { return isChecked; }
	set
	{
		if( value != this.IsChecked )
		{
			isChecked = value;
			// Folgendes Statement führt dazu dass das Databinding nicht mehr funktioniert
			base["IsChecked"] = value;

			if( this.PropertyChanged != null )
				this.PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
		}
	}
}

Kennt jemand dieses Phänomen?
Es muss irgendwas mit der ConfigurationSection, bzw. mit dem aufruf des Indexers zutun haben. Aber keine Ahnung was das sein könnte...

Hoffe mir kann jemand weiterhelfen!

Gruss

5.299 Beiträge seit 2008
vor 15 Jahren

wundert mich, daß das geht:

myItem.DataBindings.Add( new Binding( "Checked", myConfigSection, "IsChecked" ) );

Databinding geht doch nur mit Listen, und um INotifyPropertyChanged auszunutzen brauchts noch spezielle Listen, wie die BindingList<T>
Und dann brauchts noch einen Mechanismus, der die aktuell Position der Liste verwaltet, und verstellen kann, weil ein MenuItem kann ja nur einen ListenEintrag anzeigen.

Willst du eine Combo im Menu, bei der du aus verschiedenen Konfigurationen auswählen willst, oder worum gehts eigentlich?

Der frühe Apfel fängt den Wurm.

S
Sarc Themenstarter:in
417 Beiträge seit 2008
vor 15 Jahren

Hi,

ich habe geschrieben, dass es über ein "normales" Property ja funktioniert, also muss
das Databinding an sich (Liste hin oder her) nicht in Frage gestellt werden.
Es geht mir um das Problem dass es im Zusammenspiel mit der ConfigurationSection nicht funktioniert.

Databinding geht doch nur mit Listen...

Das stimmt so nicht.

Willst du eine Combo im Menu, bei der du aus verschiedenen Konfigurationen auswählen willst, oder worum gehts eigentlich?

Worum es mir geht steht im Text, und zwar dass ich die Checked-Eigenschaft eines ToolStripMenuItems an ein Property binden möchte. Was auch funktioniert, aber eben nur wenn ich die Propertywerte nicht über die ConfigurationConfig-Klasse ändere.

5.299 Beiträge seit 2008
vor 15 Jahren

Ah! (warum gibts hier eigentlich keinen "Licht-Aufgeh-Smiley"?

probierma:

var bnd = myItem.DataBindings.Add( new Binding( "Checked", myConfigSection, "IsChecked" ) );
bnd.ControlUpdateMode = ControlUpdateMode.OnPropertyChanged;

Der frühe Apfel fängt den Wurm.

S
Sarc Themenstarter:in
417 Beiträge seit 2008
vor 15 Jahren

Das habe ich auch schon versucht, ohne Erfolg.
Es liegt definitiv nicht an dem Binding ansich, sondern an dem Zusammenspiel mit der ConfigurationConfig-Klasse.

S
Sarc Themenstarter:in
417 Beiträge seit 2008
vor 15 Jahren

Hab hier mal eine Winforms Demo (VS 2008) erstellt, damit man sich von dem Phänomen überzeugen kann.

Voreingestellt ist die funktionierende Version. Kommentiert man

//#define UseConfigProperty

wieder ein, dann sieht man dass das Databinding nicht mehr klappt.

5.299 Beiträge seit 2008
vor 15 Jahren

Hmm. Is nicht lauffähig bei mir. Vor allem: Ohne .sln-File denkt meine VS2005, sie müsse das aufmachen.

Edit: neu entpacke, csproj direkt auf eine C#2008-exe-Verknüpfung ziehen, dann gehts 😉

Der frühe Apfel fängt den Wurm.