2012-01-17 4 views
9

Я пишу тестовое приложение в Windows Forms. Он имеет простую форму с TextBox и должен реализовать DataBinding. Я внедрил класс FormViewModel для хранения моих данных и имею 1 класс для своих бизнес-данных - TestObject. объектПоддерживает ли привязка данных вложенные свойства в Windows Forms?

бизнес-данных:

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

недвижимости:

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

     return _viewModel; 
    } 
} 

Так что теперь я пытаюсь связать свои данные в TextBox, как это:

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

И удивительно, что это не сработает! Ничего не меняется при изменении CurrentObject или изменении свойства TestPropertyString.

Но он прекрасно работает, когда я использую:

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

Так что мой вопрос: вложенные ли поддержка связывания данных свойств?

Благодарим за разъяснения!

ответ

8

Изменения в версии Databinding были выполнены в .NET 4.0. Ваш код работает на .NET 3.5. Я нашел этот вопрос в Microsoft Connect: .Net 4.0 simple binding issue

Вот работа, которая работала для меня. Используйте BindingSource в качестве объекта данных:

BindingSource bs = new BindingSource(_viewModel, null); 

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

Так что я не буду иметь возможность использовать его таким образом: «CurrentObject.TestPropertyString»? Какая альтернатива моему коду в WinForms? –

+0

@MaksimGladkov Я обновил ответ рабочим кодом. Возможно, у вас не было чего-то объявленного имущества. – LarsTech

+0

Странно, но это не работает для меня. Ничего не происходит. –

Смежные вопросы