Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does data binding support nested properties in Windows Forms?

I am writing the test application in Windows Forms. It has a simple form with TextBox and needs to implement DataBinding. I have implemented the class FormViewModel to hold my data, and have 1 class for my business data — TestObject.

Business Data object:

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

Property:

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

        return _viewModel;
    }
}

So now I'm trying to bind my data to TextBox like this:

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

And surprisingly, it doesn't work! Nothing changes, when I change CurrentObject, or change TestPropertyString property.

But it works great, when I use:

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

So my question is: Does data binding support nested properties?

Thank you for explanations!

like image 857
Maksim Gladkov Avatar asked Jan 17 '12 11:01

Maksim Gladkov


People also ask

What is data binding in Windows Forms?

Simple data binding is the type of binding typical for controls such as a TextBox control or Label control, which are controls that typically only display a single value. In fact, any property on a control can be bound to a field in a database. There's extensive support for this feature in Visual Studio.

What are the properties of windows form?

These include properties such as Font, ForeColor, BackColor, Bounds, ClientRectangle, DisplayRectangle, Enabled, Focused, Height, Width, Visible, AutoSize, and many others. For details about inherited properties, see System. Windows.

What is binding source in Visual Studio?

The BindingSource component acts as the data source for some or all of the controls on the form. In Visual Studio, the BindingSource can be bound to a control by means of the DataBindings property, which is accessible from the Properties window.


1 Answers

The Databinding behavior was changed in .NET 4.0. Your code works on .NET 3.5. I found this issue posted at Microsoft Connect: .Net 4.0 simple binding issue

Here was the work-around that worked for me. Use a BindingSource as the data object:

BindingSource bs = new BindingSource(_viewModel, null);

//textBox1.DataBindings.Add("Text", _viewModel, "CurrentObject.TestPropertyString");
textBox1.DataBindings.Add("Text", bs, "CurrentObject.TestPropertyString");
like image 89
LarsTech Avatar answered Oct 15 '22 18:10

LarsTech