2013-10-19 2 views
5

verwende ich .NET 3.5, WinForms, DatabindingZwei-Wege-Datenbindung in WinForms implementiert INotifyPropertyChanged in Basisklasse

Ich habe Klassen abgeleitet, die Basisklasse implementiert IPropertychanged

public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string propertyName) { 
     var handler = this.PropertyChanged; 
     if (handler != null) { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

Jeder propertysetter ruft:

protected void SetField<T>(ref T field, T value, string propertyName) { 
     if (!EqualityComparer<T>.Default.Equals(field, value)) { 
      field = value; 
      IsDirty = true; 
      this.RaisePropertyChanged(propertyName); 
     } 
    } 

Ein typisches Propertysetter:

public String LocalizationItemId { 
     get { 
      return _localizationItemId; 
     } 
     set { 
      SetField(ref _localizationItemId, value, "LocalizationItemId"); 
     } 
    } 

Die Art und Weise eine Eigenschaft auf eine Textbox

 private DerivedEntity derivedEntity 
     TextBoxDerivedEntity.DataBindings.Add("Text", derivedEntity, "Probenname"); 

Wenn ich das Textfeld programmatisch Text zuweisen gebunden ist, wird das Textfeld zeigt es nicht. Aber ich kann das Textfeld manuell bearbeiten.

+0

WinForms Databind, ich habe nie davon gehört, aber sicher im den Anfänger :) – Krekkon

Antwort

8

Binding-Quelle wird in TextBox aktualisiert Validiertes Ereignis. Das validierte TextBox-Ereignis wird aufgerufen, wenn der Benutzer TextBox bearbeitet und dann den Fokus auf ein anderes Steuerelement ändert. Da Sie TextBox-Text programmgesteuert ändern, weiß TextBox nicht, dass Text geändert wurde und daher die Validierung nicht aufgerufen wird und die Bindung nicht aktualisiert wird. Daher müssen Sie die Bindung manuell aktualisieren.

initialisieren Bindung:

var entity; 
textBox.DataBindings.Add("textBoxProperty", entity, "entityProperty"); 

ändern TextBox.Text:

textBox.Text = "SOME_VALUE"; 

Update-Bindung manuell:

textBox.DataBindings["textBoxProperty"].WriteValue(); 

Binding.WriteValue() liest Wert von Steuer- und Updates Einheit entsprechend . Sie können über WriteValue unter MSDN lesen.

7

Ich weiß, dass es zu spät ist zu beantworten, aber dieses Problem gelöst werden kann, wenn Sie Ereignis einstellen, wenn Ihre Bindung sollte Wert ändern, wenn Sie es auf Eigenschaftswert Änderungsereignis Ihr Problem gelöst wird gesetzt. Sie können dies auf diese Weise

textBox.DataBindings.Add("textBoxProperty", entity, "entityProperty", true, DataSourceUpdateMode.OnPropertyChanged); 
+0

u kann eine kleine Arbeits Code für Textbox Zweiweg Daten schreiben zu binden. Wenn Sie sich Ihren kleinen Code anschauen, können Sie sich nicht vorstellen, wie Sie ihn implementieren können. – Mou

+0

Bitte beziehen Sie sich auf diese Frage http://stackoverflow.com/questions/1616003/data-binding-for-textbox. –

+0

danke für reply.how könnte ich andere Steuerelemente wie Kontrollkästchen, Optionsfeld und Dropdown usw. binden. Ich möchte diese Kontrolle auf eine Weise als Ergebnis, wenn Daten in der Datenquelle geändert werden, dann geändert werden sollte auf der Ebene der Kontrolle widergespiegelt werden. können Sie mir mit Beispielcode helfen, wie man diese Kontrollen mit Daten 'checkboxes, Radioknopf und dropdown usw.' – Mou

1

Der Teilnehmer ist nicht initialisiert. h.

private DerivedEntity derivedEntity 
TextBoxDerivedEntity.DataBindings.Add("Text", derivedEntity, "Probenname"); 

derivedEntity ist null.

Initialisieren Sie es und alles wird gut.