Ligação de dados bidirecional em winforms, Inotifypropertychanged implementado na class base

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