2015-06-19 10 views
13

Ich habe eine Reihe von Checkboxen auf meiner Form mit ihren Checked Eigenschaften Boolesche Eigenschaften auf dem Datenmodell gebunden:Warum sollte ich eine Formatausnahme erhalten, wenn ich eine boolesche Bindung mit WriteValue aktualisiere?

chk1.DataBindings.Add(new BindingValue(this, "Checked", "MyBooleanProperty1", false)) 
chk2.DataBindings.Add(new BindingValue(this, "Checked", "MyBooleanProperty2", false)) 
chk3.DataBindings.Add(new BindingValue(this, "Checked", "MyBooleanProperty3", false)) 

Es gibt auch einen Event-Handler für alle Kontrollkästchen auf dem Bildschirm, der die Databound Wert stellt sicher, geteilt ist, korrekt auf den geprüften Wert gesetzt.

private void AllCheckboxes_CheckedChanged(object sender, EventArgs e) 
{ 
    var chk = ((CheckBox)sender); 

    var binding = chk.DataBindings["Checked"]; 
    if (binding != null) 
     binding.WriteValue(); 
} 

In einigen Fällen kann das erste Mal in dieser Form und die Bindungen geladen werden, erhalte ich eine Ausnahme:

Kann den Wert auf die gewünschte Art nicht formatiert werden.

bei System.ComponentModel.ReflectPropertyDescriptor.SetValue (Object Komponente, Object-Wert) bei System.Windows.Forms.BindToObject.SetValue (Objektwert) bei System.Windows.Forms.Binding.PullData (Boolean umformatieren, Boolean Kraft) bei System.Windows.Forms.Binding.WriteValue()

Es richtig für das erste Kontrollkästchen funktioniert das Ereignis zu verarbeiten, aber dann wird die zweite, diese Ausnahme werfen.

Die Datenquelle ist eine Schnittstelle meiner Datenmodell

public interface IMyDataModel 
{ 
    bool MyBooleanProperty1 { get; set; } 
    bool MyBooleanProperty2 { get; set; } 
    bool MyBooleanProperty3 { get; set; } 
} 

Und ich kann das Datenmodell überprüfen, ob sich richtig eingestellt ist, einen Haltepunkt direkt vor dem .WriteValue im Ereignishandler, indem. Ich kann sogar einen Haltepunkt in den Setter der gebundenen booleschen Eigenschaft setzen, und es wird auch korrekt aufgerufen.

Wenn ich die FormattingEnabled Eigenschaft der Bindung auf True setzt, behebt es das Problem. Aber ich frage mich, warum ich das überhaupt erst machen muss, da ich eine System.Boolean -Eigenschaft im UI-Objekt an eine bool -Eigenschaft an der Datenquelle binde.

Warum sollte ich in diesem Fall diese Ausnahme bekommen?

+0

haben Sie aktiviert 'IsThreeState' Eigenschaft gehen kann? –

+0

Nein, IsThreeState ist nicht festgelegt – Rachel

+0

Ich würde versuchen, "IsThreeState" zu setzen oder binden Sie an NULL Bool. Ich verstehe, dass dies nicht wie ein Nullbindungs-Problem aussieht, aber ich erwarte, dass es in Checkboxen null behandelt. –

Antwort

1

Es ist schwer zu sagen, was passiert, ohne eine Möglichkeit, das Problem zu reproduzieren.

Aber zumindest kann ich erklären, warum FormattingEnabled Einstellung der Ausnahme gehen macht weg:

http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Binding.cs,853

WriteData Anrufe PullData mit reformat = true und force = true.

Von Ihrem Call-Stack, es sieht aus wie Sie es in diesem Block machen müssen:

  // Put the value into the data model 
      if (!parseFailed) { 
       this.bindToObject.SetValue(parsedValue); 
      } 

sofort, dass nach der Ausnahme es sei denn,FormattingEnabled = true erneut ausgelöst wird. Die Einstellung FormattingEnabled hier verbirgt das Problem, da es so aussieht, als ob Binding davon ausgeht, dass Sie alle Formatierungs-/Parsing-Probleme behandeln werden, die es bisher selbst gefunden hat.

Warum die Ausnahme an erster Stelle geworfen wird ... Ich weiß es nicht.Nichts ist offensichtlich, sucht hier:

http://referencesource.microsoft.com/#system/compmod/system/componentmodel/ReflectPropertyDescriptor.cs,1138

Ich wäre neugierig zu wissen, ob Ihr Problem weiterhin besteht, wenn Sie einen Weg finden, Ihre Datenbindungen ohne Ihre BindingValue benutzerdefinierte Klasse hinzuzufügen. Ich wäre auch neugierig, wenn Sie Hörer in BindingValue verdrahtet haben.

+1

Vielen Dank für den Code Links, diese Hilfe. Ich habe das Problem auf etwas beschränkt, das durch unseren internen Änderungsbenachrichtigungscode im get/set der Eigenschaft verursacht wurde. Verwenden eines regulären generischen 'Get; set; 'verursacht keine Ausnahme. Ich vergebe Ihnen das Bounty, weil die MSDN-Code-Links die beste Erklärung dafür liefern, warum ich den Fehler erhalte und vorzuschlagen, wo er herkommen könnte, also werde ich später in dieser Richtung debuggen, wenn ich mehr Zeit habe . Vielen Dank. – Rachel

0

Ich denke, es wirft eine Ausnahme, wenn Parse/Format nicht behandelt wird, weshalb formattingEnabled scheint zu arbeiten.

Versuchen Sie, die Ereignisse Binding.Format und Binding.Parse zu behandeln, um zu überprüfen, ob die Typen, die es sendet (und erwartet), korrekt sind.

+0

Beide Ereignisse zeigen korrekt "e.DesiredType" und "e.Value" als "System.Boolean" an. Sie scheinen auch beide ohne Ausnahmen korrekt zu treffen. – Rachel

0

Das ist, was ich tun würde. Das Modell sollte die Schnittstelle INotifyPropertyChanged implementieren. Fügen Sie ein BindingSource zu Ihrem Formular von der ToolBox hinzu. Stellen Sie die DataSource davon auf Ihr Modell. Setzen Sie für jedes Kontrollkästchen die Datenbindung. Ich würde das erweiterte Fenster verwenden und den Datenquellenaktualisierungsmodus auf OnPropertyChanged setzen. In diesem Fall müssen Sie keine Event-Handler für Ihre Kontrollkästchen festlegen.

+0

In einer besseren Welt würde ich 'INotifyPropertyChanged' verwenden, allerdings habe ich in diesem Fall keine Kontrolle über die Anwendungsinfrastruktur und kann sie nicht ohne großen Aufwand ändern. Außerdem suche ich nach einer Antwort darüber, warum dies geschieht, und nicht nach möglichen Korrekturen. – Rachel

0

Versuchen durch Aktivieren der Formatierung als folgt-

this.chk1.DataBindings.Add(new System.Windows.Forms.Binding("EditValue", this.bindingSource1, "MyProperty", true)); 

Sie auch durch die folgende Link-

http://msdn.microsoft.com/en-us/library/system.windows.forms.binding.formattingenabled.aspx

+1

Wie ich bereits in meiner Frage gesagt habe, weiß ich, die Formatierung wird es "beheben", aber ich möchte wissen, was das Problem an erster Stelle verursacht. – Rachel