Как привязка данных в C# WinForms предположена работать, когда у Вас есть кнопка Save? Я не хочу данные, обновленные, пока я не нажимаю Save!
У меня есть две формы (список и деталь) поддержанный a BindingList<T>
набор и мой пользовательский объект от того набора, соответственно. Я могу связать каждую форму со списком или объектом соответственно. Однако любые изменения, внесенные в форме детали, сразу отражаются в форме списка - я не хочу сохранять изменения и обновлять детали, показанные в списке, пока кнопка Save не нажимается.
Привязка данных разработана для поддержки этого? Существует ли общий шаблон для того, чтобы сделать так?
Какой бы ни способ, которым я смотрю на него, привязка, кажется, не может поддерживать этот сценарий. Я рассмотрел следующее:
Передайте клон объекта к форме детали, но затем я должен согласовать изменения на Сохранении - изменения, возможно, были внесены в копию в списке тем временем.
Реализация IEditableObject
и вызов EndEdit
на сохранении почти работает, поскольку я могу предотвратить список, уведомляемый относительно изменений, внесенных, пока Сохранение не нажимается, но если что-то еще вызывает обновление, список обновляется с временными данными.
Меня в настоящее время оставляют с обхождением без привязки данных в моем представлении детали и выполнении всего этого вручную. Который является довольно раздражающим.
Привязка данных действительно не была предназначена для такого рода вещей, к сожалению.
Лучшее решение, которое мы нашли здесь, — это отредактировать клоны объектов, а затем согласовать изменения, как вы упомянули. Возможно, вы захотите придумать пользовательскую коллекцию и / или интерфейс объектов, который поможет вам управлять этим типом вещей.
Даже если метод клонирования немного больше работает заранее, он будет менее сложным и разочаровывающим, чем использование IEditableObject
, пытающегося уловить все возможные события, которые обновляют данные. Мало того, это более простой подход, и вы не получите код спагетти.
Если вы настроены на использование списка привязки, лучше всего будет реализовать IBindingList для создания желаемой функциональности. Это также можно сделать, просто унаследовав от BindingList и переопределив соответствующие методы для изменения поведения списка привязки.
http://msdn.microsoft.com/en-us/library/system.componentmodel.ibindinglist.aspx
Если вы не настроены на использование списка привязки, вероятно, лучше всего выполнять манипуляции с данными вручную на основе событий элемента управления.
Удачи.