У меня есть приложение и окно настроек с TabControl, содержащее пару TabItems. Каждый из них имеет некоторые поля (текстовые поля), которые привязываются к одному и тому же объекту Singleton.
Есть ли какой-либо элегантный и подобный WPF способ привязки данных только после нажатия кнопки «Сохранить»?
В настоящее время он привязан к базе данных сразу после изменения содержимого текстового поля, и я хочу, чтобы этот синглтон имел старые значения и обновлял их только после нажатия кнопки сохранения.WPF привязка данных после нажатия кнопки «Сохранить»
ответ
Вместо того, чтобы повышать уведомление об изменении в наборе каждого свойства (поскольку это то, что вызывает повторное связывание и обновление), поместите все уведомления о повышении в кнопку сохранения. Затем, когда вы нажимаете «Сохранить», вы сохраняете и указываете «Вид» на повторную привязку к тем (теперь установленным) свойствам.
Для этого: Привязать к свойствам, отличным от одноэлементного (как вы хотите сохранить старые настройки до тех пор, пока не будет нажата кнопка «Сохранить») - без уведомления о повышении для этих свойств.
В вашей кнопке сохранения задайте свойства singleton, а затем поднимите все уведомления о других свойствах.
В вашей кнопке отмены установите другие свойства в значениях свойств одиночного элемента и поднимите все уведомления.
Не забудьте указать свойства свойства singleton при первом загрузке представления и поднять все уведомления (как и отменить).
Если вы используете WPF, измените UpdateSourceTrigger на LostFocus. Я думаю, что это решит цель.
Text="{Binding Path=MyText, UpdateSourceTrigger=LostFocus, Mode=TwoWay}"
Для вашего DataBinding
объекта, используемого в XAML для Textbox
, используйте свойство UpdateSourceTrigger
со значением Explicit
, как показано ниже:
<TextBox Name="itemNameTextBox"
Text="{Binding Path=ItemName, UpdateSourceTrigger=Explicit}" />
При установке значения UpdateSourceTrigger в Явное, значение источника только изменяется, когда приложение вызывает метод UpdateSource
, как показано ниже (вы можете поставить ниже код в Save Click
event):
BindingExpression be = itemNameTextBox.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();