.net WinForms привязка данных с использованием Lambda вместо свойства
В моем проекте у меня есть модель, и я хочу связать видимое состояние метки, используя одно из свойств модели. Я не хочу добавлять другое свойство ShowLabel к модели. Я хочу иметь возможность написать что-то вроде этого:
label.Bindings.Add("Visible", model, m => m.Name != "Default");
По сути, я хочу написать лямбда-выражение вместо добавления свойства в мою модель. Это возможно?
2 ответа
Да, вы можете сделать это, используя событие Format класса Binding. Вы по-прежнему будете привязываться к рассматриваемому свойству, но ваш обработчик события Format вернет другое значение (в данном случае - bool).
var binding = new Binding("Visible", model, "Name");
binding.Format += (sender, args) => args.Value = (string)args.Value != "Default";
label.DataBindings.Add(binding);
Привязка данных Windows Forms распознает ICustomTypeDescriptor
интерфейс, который позволяет объекту решать во время выполнения, какие свойства он представляет для привязки данных. Поэтому, если вы напишете реализацию этого, вы можете сказать Windows Forms, что у вас есть любые свойства, которые вам нравятся, и вы можете решить, как их реализовать.
Конечно, это может не помочь - если вы хотите избежать добавления свойства, вы также можете избежать реализации довольно сложного интерфейса. Очевидным решением будет написать тип, работа которого заключается в том, чтобы выступать в качестве источника данных и связываться с ним вместо того объекта, к которому вы в данный момент привязываетесь.
Конечно, если вы сделаете это, возможно, тогда будет проще реализовать любое свойство, которое вы собирались реализовать в этой оболочке.
В общем случае с привязкой данных вы хотите избегать привязки напрямую к какой-либо базовой модели именно потому, что вам не нужно добавлять какие-либо элементы в вашу модель исключительно в интересах пользовательского интерфейса. Вот почему "разделенная презентация" очень популярна - вместо того, чтобы напрямую соединять модель и представление, вы вставляете что-то посередине, чья работа заключается в посредничестве. Кто-то называет это моделью представления, кто-то называет ее докладчиком, но основным принципом всегда является разделение представления.
Похоже, вы пытаетесь добиться отдельного представления (что хорошо), но без введения дополнительного типа, так что этому среднему слою есть куда идти. Почему бы просто не определить класс (или набор классов), который будет действовать как этот слой?