Какая архитектура?
Для односторонней привязки вам не нужно ничего, кроме открытых свойств - и, возможно, некоторых TypeConverter
реализаций для любых типов данных на заказ (struct
s и т. Д.)
Для полной двусторонней привязки вам потребуется реализация событий - любая из:
- a "публичное событие EventHandler FooChanged" для каждого свойства "Foo"
- реализация `INotifyPropertyChanged
- сделанная на заказ модель компонента (не ходи туда - перебор)
Для примера реализации INotifyPropertyChanged
(обратите внимание, вы можете переместить часть кода для повторного использования):
public class Foo : INotifyPropertyChanged
{
private string bar;
public string Bar
{
get { return bar; }
set { UpdateField(ref bar, value, "Bar"); }
}
// other properties...
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null) PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
protected bool UpdateField<T>(ref T field, T value,
string propertyName)
{
if (!EqualityComparer<T>.Default.Equals(field, value))
{
field = value;
OnPropertyChanged(propertyName);
return true;
}
return false;
}
}
Чтобы связать наборы данных (сетки и т. Д.), Проще всего использовать дженерики; в основном, minumum равен IList
- но вы получаете дополнительные метаданные от индексатора public T this[int index]
- которые есть у List<T>
, Collection<T>
и т. д. Подробнее - BindingList<T>
реализует IBindingList
, разрешающий события уведомления на основе коллекции (но только для INotifyPropertyChanged
- не для шаблона FooChanged
).