C#: DataBindings или триггер на изменение значения

Наверное многим в процессе написания ПО достаточно часто приходилось связывать свойства разных объектов с каким либо определенным значением. Поэтому сегодня я решил рассказать о такой возможности языка программирования C# как DataBindings.

Чтобы хоть как то визуализировать задачу, представим себе что у нас есть класс который рисует нам линии, причем количество линий определяется свойством класса «LinesCount». Мы хотим добавить на форму элемент управления «NumericUpDown» чтобы пользователь мог сам менять рисуемое число линий.
Конечно решить такую задачу можно разными способами. Первый способ это явно присваивать нужное значение свойству «LinesCount». Однако если значение меняется в нескольких местах, то код начинает повторяться, да и легко запутаться. Можно повесить события на изменение значения нашего «NumericUpDown» и в нем присваивать текущее значение нашему свойству класса. Однако представьте что таких свойств и котроллов управления много? Вы просто запутаетесь или начнете забывать, что где и когда нужно менять и добавлять. В связи с этим к нам на помощь приходит свойство контроллов DataBindings, которое позволяет связать разные объекты, что приводит к автоматическому изменению определенных значений, при изменении значений у источника данных.
В нашем случае источником данных будет выступать «NumericUpDown» и его свойство «Value», а приемником данных свойство «LinesCount» класса. Чтобы дальнейший код был понятен, пусть экземпляром «NumericUpDown» в программе выступает объект numericUpDown1, а экземпляром класса приемника объект myClassObj. Тогда в коде программы нам достаточно написать следующую строчку:

numericUpDown1.DataBindings.Add("Value", myClassObj, "LinesCount", false, DataSourceUpdateMode.OnPropertyChanged);

Вот и все. Теперь при изменении значения Value у numericUpDown1, значение LinesCount у myClassObj автоматически станет таким же. Однако существует одно ограничение. Нельзя добавить несколько связок на одно и тоже свойства класса источника. Таким образом если Вам необходимо изменить LinesCount, скажем, у объекта myClassObj2, то DataBindings должно добавляться обхект myClassObj и свойство LinesCount, например:

numericUpDown1.DataBindings.Add("Value", myClassObj, "LinesCount", false, DataSourceUpdateMode.OnPropertyChanged);
numericUpDown1.DataBindings.Add("Value", myClassObj2, "LinesCount", false, DataSourceUpdateMode.OnPropertyChanged); //Error
myClassObj.DataBindings.Add("LinesCount", myClassObj2, "LinesCount", false, DataSourceUpdateMode.OnPropertyChanged); //Ok
Запись опубликована в рубрике C# с метками , , , , , , , , , . Добавьте в закладки постоянную ссылку.