2013-10-19 1 views
5

Io uso Net 3.5, WinForms, Databindingbidirezionale associazione dati in WinForms, INotifyPropertyChanged implementato in classe di base

ho derivato classi, la classe di base implementa IPropertychanged

public event PropertyChangedEventHandler PropertyChanged; 

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

Ogni propertysetter chiama:

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); 
     } 
    } 

Un tipico Propertysetter:

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

Il modo in cui una proprietà è destinata a una casella di testo

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

Se io programmazione assegno di testo alla casella di testo, la casella di testo non vederlo. Ma posso modificare manualmente la casella di testo.

+0

Winforms Databind, non ne ho mai sentito parlare, ma sicuramente al principiante :) – Krekkon

risposta

8

L'origine del binding viene aggiornata sull'evento Validato TextBox. L'evento convalidato TextBox viene chiamato quando l'utente modifica TextBox e quindi passa a un altro controllo. Dato che stai modificando il testo di TextBox a livello di codice, TextBox non sa che il testo è stato modificato e pertanto la convalida non viene chiamata e l'associazione non viene aggiornata, quindi è necessario aggiornare manualmente l'associazione.

inizializzazione vincolante:

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

Cambio TextBox.Text:

textBox.Text = "SOME_VALUE"; 

Aggiornamento vincolante manualmente:

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

Binding.WriteValue() legge il valore dal controllo e gli aggiornamenti entità di conseguenza . Si può leggere su WriteValue allo MSDN.

7

So che è troppo tardi per rispondere, ma questo problema può essere risolto, se si imposta evento quando l'associazione deve cambiare valore, se si imposta su evento di modifica del valore della proprietà il problema verrà risolto. È possibile farlo in questo modo

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

è possibile pubblicare un piccolo codice di lavoro per l'associazione dei dati bidirezionale di textbox. solo guardando il tuo piccolo codice non è possibile visualizzare come implementarlo? – Mou

+0

Per favore fai riferimento a questa domanda http://stackoverflow.com/questions/1616003/data-binding-for-textbox. –

+0

grazie per reply.how potrei associare altri controlli come checkboxes, radio button e dropdown ecc. Voglio legare questi controlli in un modo come risultato quando i dati saranno cambiati nell'origine dati che poi cambieranno dovrebbero essere riflessi a livello di controllo. puoi aiutarmi con un codice di esempio come associare questi controlli con le caselle di controllo dei dati, il pulsante di opzione e il menu a discesa, ecc. – Mou

1

L'utente non è inizializzato. Ad esempio

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

derivedEntity è nullo.

Inizializza e starai bene.