Eu uso .net 3.5, WinForms, binding de dados
Eu tenho classs derivadas, a class base implementa IPropertychanged
public event PropertyChangedEventHandler PropertyChanged; private void RaisePropertyChanged(string propertyName) { var handler = this.PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } }
Cada propertysetter chama:
protected void SetField(ref T field, T value, string propertyName) { if (!EqualityComparer.Default.Equals(field, value)) { field = value; IsDirty = true; this.RaisePropertyChanged(propertyName); } }
Um Propertysetter típico:
public String LocalizationItemId { get { return _localizationItemId; } set { SetField(ref _localizationItemId, value, "LocalizationItemId"); } }
A maneira como uma propriedade é vinculada a uma checkbox de texto
private DerivedEntity derivedEntity TextBoxDerivedEntity.DataBindings.Add("Text", derivedEntity, "Probenname");
Se eu programaticamente atribuir texto à checkbox de texto, a checkbox de texto não mostrará. Mas eu posso editar manualmente a checkbox de texto.
A origem da binding é atualizada no evento TextBox Validated. O evento validado TextBox é chamado quando o usuário edita o TextBox e, em seguida, altera o foco para outro controle. Como você está alterando o texto do TextBox de forma programática, o TextBox não sabe que o texto foi alterado e, portanto, a validação não é chamada e a binding não é atualizada, portanto, é necessário atualizar a binding manualmente.
Inicializar binding:
var entity; textBox.DataBindings.Add("textBoxProperty", entity, "entityProperty");
Alterar TextBox.Text:
textBox.Text = "SOME_VALUE";
Atualizar binding manualmente:
textBox.DataBindings["textBoxProperty"].WriteValue();
Binding.WriteValue () lê o valor do controle e atualiza a entidade de acordo. Você pode ler sobre WriteValue no MSDN .
Eu sei que é tarde demais para responder, mas esse problema pode ser resolvido, se você definir o evento quando sua binding deve alterar o valor, se você configurá-lo no evento de alteração do valor da propriedade seu problema será resolvido. Você pode fazer isso por este caminho
textBox.DataBindings.Add("textBoxProperty", entity, "entityProperty", true, DataSourceUpdateMode.OnPropertyChanged);
O assinante não foi inicializado. ou seja
private DerivedEntity derivedEntity TextBoxDerivedEntity.DataBindings.Add("Text", derivedEntity, "Probenname");
derivedEntity
é nulo.
Inicialize e você ficará bem.
Eu implementei o “INotifyPropertyChanged”, mas aumente o evento PropertyChanged somente quando o novo valor for diferente do valor antigo:
public class ProfileModel : INotifyPropertyChanged { private Guid _iD; private string _name; public event PropertyChangedEventHandler PropertyChanged; public Guid ID { get => _iD; set { if (_iD != value) { _iD = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ID")); } } } public string Name { get => _name; set { if (_name != value) { _name = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name")); } } } }
Agora é só ligar para os controles:
txtProfileID.DataBindings.Clear(); txtProfileID.DataBindings.Add("Text", boundProfile, "ID", true, DataSourceUpdateMode.OnPropertyChanged);