2012-01-17 21 views
9

Estoy escribiendo la aplicación de prueba en Windows Forms. Tiene un formulario simple con TextBox y necesita implementar DataBinding. Implementé la clase FormViewModel para guardar mis datos y tengo 1 clase para mis datos comerciales: TestObject. objeto¿El enlace de datos admite propiedades anidadas en Windows Forms?

de datos profesionales:

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

modelo de vista:

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

propiedad:

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

     return _viewModel; 
    } 
} 

Así que ahora estoy tratando de obligar a los datos de mi cuadro de texto así:

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

Y sorprendentemente, ¡no funciona! Nada cambia, cuando cambio CurrentObject o cambio la propiedad TestPropertyString.

Pero funciona muy bien, cuando uso:

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

Así que mi pregunta es: ¿Tiene propiedades anidado apoyo de enlace de datos?

¡Gracias por las explicaciones!

Respuesta

8

El comportamiento Databinding se modificó en .NET 4.0. Tu código funciona en .NET 3.5. Encontré este problema publicado en Microsoft Connect: .Net 4.0 simple binding issue

Aquí estaba el trabajo que funcionó para mí. Use un BindingSource como el objeto de datos:

BindingSource bs = new BindingSource(_viewModel, null); 

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

Así que no será capaz de utilizarlo de tal manera: "CurrentObject.TestPropertyString"? ¿Cuál es la alternativa a mi código en WinForms? –

+0

@MaksimGladkov Actualicé la respuesta con código de trabajo. Tal vez no tengas algo declarado propiedad. – LarsTech

+0

Extraño, pero esto no funciona para mí. Nada sucede de todos modos. –

Cuestiones relacionadas