Поддерживает ли привязка данных вложенные свойства в Windows Forms? - PullRequest
9 голосов
/ 17 января 2012

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

Объект бизнес-данных:

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

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

Спасибо за объяснения!

1 Ответ

8 голосов
/ 17 января 2012

Поведение Databinding было изменено в .NET 4.0. Ваш код работает на .NET 3.5. Я обнаружил, что эта проблема опубликована в Microsoft Connect: .Net 4.0 проблема простой привязки

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

BindingSource bs = new BindingSource(_viewModel, null);

//textBox1.DataBindings.Add("Text", _viewModel, "CurrentObject.TestPropertyString");
textBox1.DataBindings.Add("Text", bs, "CurrentObject.TestPropertyString");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...