2012-01-17 9 views
9

Piszę aplikację testową w Windows Forms. Ma prostą formę z TextBox i wymaga implementacji DataBinding. Zaimplementowałem klasy FormViewModel do przechowywania moich danych i mam 1 klasę dla moich danych biznesowych - TestObject. ObiektCzy powiązanie danych obsługuje zagnieżdżone właściwości w Windows Forms?

Business Data:

public class TestObject : INotifyPropertyChanged 
{ 
    private string _testPropertyString; 
    public string TestPropertyString 
    { 
     get 
     { 
      return _testPropertyString; 
     } 
     set 
     { 
      if (_testPropertyString != value) 
      { 
       _testPropertyString = value; 
       RaisePropertyChanged("TestPropertyString"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

ViewModel:

public class FormViewModel : INotifyPropertyChanged 
{ 
    private TestObject _currentObject; 
    public TestObject CurrentObject 
    { 
     get { return _currentObject; } 
     set 
     { 
      if (_currentObject != value) 
      { 
       _currentObject = value; 

       RaisePropertyChanged("CurrentObject"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

nieruchomości:

private FormViewModel _viewModel; 
public FormViewModel ViewModel 
{ 
    get 
    { 
     if (_viewModel == null) 
      _viewModel = new FormViewModel(); 

     return _viewModel; 
    } 
} 

Więc teraz staram się wiązać moje dane do TextBox tak:

TextBox.DataBindings.Add("Text", ViewModel, "CurrentObject.TestPropertyString"); 

I zaskakująco, to nie działa! Nic się nie zmienia, gdy zmieniam CurrentObject lub zmieniam właściwość TestPropertyString.

Ale to działa świetnie, kiedy używam:

TextBox.DataBindings.Add("Text", ViewModel.CurrentObject, "TestPropertyString"); 

Więc moje pytanie brzmi: czy wsparcie wiązania danych zagnieżdżone właściwości?

Dziękuję za wyjaśnienia!

Odpowiedz

8

Zachowanie Databinding zostało zmienione w .NET 4.0. Twój kod działa na platformie .NET 3.5. Ten problem został opublikowany w witrynie Microsoft Connect: .Net 4.0 simple binding issue

To była praca, która sprawdziła się u mnie. Użyj BindingSource jako obiekt danych:

BindingSource bs = new BindingSource(_viewModel, null); 

//textBox1.DataBindings.Add("Text", _viewModel, "CurrentObject.TestPropertyString"); 
textBox1.DataBindings.Add("Text", bs, "CurrentObject.TestPropertyString"); 
+0

Więc nie będzie mógł go używać w taki sposób: „CurrentObject.TestPropertyString”? Jaka jest alternatywa dla mojego kodu w WinForms? –

+0

@MaksimGladkov Zaktualizowałem odpowiedź za pomocą działającego kodu. Może nie masz czegoś zadeklarowanego własności. – LarsTech

+0

Dziwne, ale to nie działa dla mnie. I tak nic się nie dzieje. –

Powiązane problemy