2012-01-17 67 views
9

我在Windows窗體中編寫測試應用程序。它具有TextBox的簡單形式,需要實現DataBinding。我已經實現了FormViewModel類來保存我的數據,並有1個類用於我的業務數據 - TestObject。數據綁定是否支持Windows窗體中的嵌套屬性?

業務數據對象:

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

視圖模型:

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.DataBindings.Add("Text", ViewModel, "CurrentObject.TestPropertyString"); 

令人驚訝的是,它不起作用!當我更改CurrentObject或更改TestPropertyString屬性時,沒有任何更改。

但它的偉大工程,當我使用:

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

所以我的問題是:是否支持數據綁定嵌套的屬性?

謝謝你的解釋!

回答

8

在.NET 4.0中更改了Databinding行爲。您的代碼在.NET 3.5上運行。我發現這個問題張貼在微軟連接:.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中的代碼有什麼替代方法? – 2012-01-17 13:46:47

+0

@MaksimGladkov我用工作代碼更新了答案。也許你沒有聲明屬性。 – LarsTech 2012-01-17 14:11:55

+0

奇怪,但這不適合我。無論如何沒有任何反應 – 2012-01-17 15:09:21