Использование BindingSource для привязки к вложенным свойствам - или, делая объекты привязываемыми
Связывание с вложенным свойством достаточно просто:
checkBox1.DataBindings.Add(new Binding("Checked", bindingSource, "myProperty")); //Normal binding
checkBox2.DataBindings.Add(new Binding("Checked", bindingSource, "myProperty.innerProperty")); //Nested property
Однако, когда myProperty.innerProperty
изменено, события не возникают - BindingSource никогда не уведомляется об этом изменении.
Я читал, что решение должно" убедиться, что когда объект innerProperty
вызывает событие PropertyChanged
, MyProperty
, содержащий innerProperty
, захватывает событие, а также вызывает событие PropertyChanged
.
Однако инфраструктура entity не делает этого для меня, и я бы предпочел не проходить через каждый экземпляр каждого класса и проводки настраиваемый метод для каждого свойства навигации, чтобы сделать мои классы связанными. Есть ли подходящий способ обхода, чтобы объекты связывались?
Ответы
Ответ 1
Вы должны реализовать INotifyPropertyCHanged в своем классе.
Ваша собственность должна выглядеть примерно так.
private bool _checked;
public bool Checked
{
get { return _checked; }
set
{
if (value != _checked)
{
_checked = value;
OnPropertyChanged("Checked");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyCHanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
Я не уверен, что это работает для winforms. Он работает для WPF и Silverlight.
Ответ 2
Вы можете попробовать POCO Entity Generator или функцию EF Code-First, которая все еще находится в CTP.
Оба подхода требуют EF4, хотя.
Ответ 3
Изменены ли ваши свойства в том же контексте, который используется в пользовательском интерфейсе?
Если это так, отредактируйте файл T4, который вы используете для создания своих объектов.
- Заставить создавать объекты INotifyPropertyChanged со свойствами, которые уведомляют об изменениях и имеют явное поле.