WinForms - jak poprawnie zrobić binding?

0

Witam,
mam taki problem:

stworzyłem sobie formę (z text boxem) i model (z jednym property typu string).

public class MyModel
{
public string MyText{get; set;}
}

Binding ustawiam następująco:

tbMyTextBox.DataBindings.Clear();
tbMyTextBox.DataBindings.Add("Text", myModel, "MyText");

Dodałem button i metodę onClick dla niego.
Gdy wpiszę wartość w text box i kliknę przycisk, w modelu wartośc properiesa MyText jest równa tej, która została wpisana do textboxa.
Czyli binding zadziałał.
Ale jeśli teraz do MyText podstawię inną wartość (lub ją wyczyszczę) w TextBoxie nic się nie zmienia.
Czyli binding w drugą stronę nie działa.

Co robię źle?

1

musisz poinformować kiedy wartość się zmienia
żeby to zrobić powinieneś zaimplementować interfejs INotifyPropertyChanged i wywoływać zdarzenie z nazwą atrybutu w setterze tego atrybutu

0

Faktycznie, działa.
Dzięki.

0

z tego powodu ja nie widzę sensu w tych bindingach. skoro to nie dzieje się automatycznie, to po co kod komplikować. prościej jest zmienić bezpośrednio property kontrolki.

0

@Azarien Bindingi są po to właśnie żeby nie odwoływać się bezpośrednio do kontrolki.

2
Azarien napisał(a):

z tego powodu ja nie widzę sensu w tych bindingach. skoro to nie dzieje się automatycznie, to po co kod komplikować. prościej jest zmienić bezpośrednio property kontrolki.

Wystarczy wyklikać sobie BindingSource i już wszystko jest automatycznie.

0

To ja dodam jeszcze jedno pytanie odnośnie bindingów.

Co jeśli mam model, który zawiera inny model:

 
public class FirstModel
{
       public SecondModel SecondModel{get;set;}
}

public class SecondModel : INotifyPropertyChanged
{
      private string code;

      public string Code
      {
             get {return code;}
             set
             {
                   if(code != value)
                   {
                       code = value;
                      PropertyChanged(this, new PropertyChangedEventArgs("Code"));
                   }
              }
       }

      public event PropertyChangedEventHandler PropertyChanged;
}

i binding jest

 
textboxCode.DataBindings.Add("Text", FirstModel.SecondModel, "Code", true, DataSourceUpdateMode.OnPropertyChanged);

Niestety przy zmianie Code'a dostaję
Object reference not set an instance of an object.
Na linijce z PropertyChanged(this,....)

Why?????

0

Bo nie utworzyłeś nigdzie nowej instancji tego drugiego modelu.

0

Utworzyłem.

SecondModel nie jest nullem.
Nullem jest PropertyChange event.

0

PS. Gdybym nie utrzowył SecondModelu (byłby null) to już na etapie bindowania by mi wywaliło że nie może być null

1 użytkowników online, w tym zalogowanych: 0, gości: 1