Кажется, я не могу найти простого и конкретного объяснения того, как привязать элементы управления в приложении WinForms к вложенным объектам с помощью привязки данных. Например:
class MyObject : INotifyPropertyChanged
{
private string _Name;
public string Name
{
get { return _Name; }
set
{
_Name = value;
OnPropertyChanged("Name");
}
}
private MyInner _Inner;
public MyInner Inner
{
get { return _Inner; }
set
{
_Inner = value;
OnPropertyChanged("Inner");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
class MyInner : INotifyPropertyChanged
{
private string _SomeValue;
public string SomeValue
{
get { return _SomeValue; }
set
{
_SomeValue = value;
OnPropertyChanged("SomeValue");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Теперь представьте себе форму с двумя текстовыми полями, первое для Name и второе для Inner.SomeValue. Я легко могу получить привязку для работы с именем, но Inner.SomeValue ненадежный. Если я заполняю объект, а затем настраиваю привязку, он показывает Inner.SomeValue в текстовом поле, но я не могу его редактировать. Если я начну с нового объекта без инициализации Inner, я не смогу заставить данные вставляться в Inner.SomeValue.
Я проверил весь MSDN, весь StackOverflow и десятки поисковых запросов с разными ключевыми словами. Все хотят говорить о привязке к базам данных или DataGrid, и большинство примеров написано на XAML.
Обновление: я попробовал полную тестовую систему Марка и добился частичного успеха. Если я нажму "все изменить!" кнопку, я, кажется, могу писать обратно во внутренний объект. Однако, начиная с MyObject.Inner null, он не знает, как создать внутренний объект. Я думаю, что на данный момент я могу обойти это, просто убедившись, что мои внутренние ссылки всегда установлены на действительный объект. Тем не менее, я не могу отделаться от ощущения, что я что-то упускаю :)