Привязка WPF (dataGrid) OneWayToSource, UpdateSourceTrigger-Explicit - нежелательное обновление источника
У меня проблема с нежелательным обновлением источника в сценарии OneWayToSource, UpdateSourceTrigger.Explicit
Справочная информация: у меня есть DataGrid, содержащий пользовательские данные со столбцом пароля. Я вывел класс DataGridPasswordColumn из DataGridTemplateColumn в
Отображение некоторых фиктивных замаскированных данных в режиме без редактирования (например, ####). Это делается путем установки CellTemplate в TextBlock с постоянным значением:
FrameworkElementFactory frameworkElementFactory = new FrameworkElementFactory(typeof(TextBlock));
frameworkElementFactory.SetValue(TextBlock.TextProperty, Properties.Resources.passwordEncrypted);
CellTemplate = new DataTemplate { VisualTree = frameworkElementFactory };
и для отображения двух элементов управления PasswordBox и кнопки OK в режиме редактирования используется следующий код:
FrameworkElementFactory frameworkElementFactory = new FrameworkElementFactory(typeof(PasswordEntry));
Binding bindingPassword = new Binding(propertyNamePassword)
{
Mode = BindingMode.OneWayToSource,
// we only want the target to source binding get activated on explicit request (user clicks on 'OK' button)
UpdateSourceTrigger = UpdateSourceTrigger.Explicit,
// we need to catch and prevent the undesired source update
NotifyOnSourceUpdated = true
};
frameworkElementFactory.SetBinding(PasswordEntry.SelectedPasswordProperty, bindingPassword);
CellEditingTemplate = new DataTemplate { VisualTree = frameworkElementFactory };
PasswordEntry - это пользовательский элемент управления, который
- Имеет свойство DependencyProperty с именем "SelectedPasswordProperty"
и ждет, когда пользователь нажмет кнопку OK, а затем выполнит некоторую проверку (идентично ли содержимое двух паролей Box?). Если проверка в порядке, вызывает UpdateSource с помощью следующего кода
BindingExpression be = this.GetBindingExpression(SelectedPasswordProperty); if (be!= null) { be.UpdateSource(); }
Обновление источника в порядке.
Проблема в том, что при открытии шаблона редактирования ячейки (PasswordEntry UserControl) происходит одно нежелательное обновление источника, имеющее значение NULL.
Я ожидал, что когда используется UpdateSourceTrigger = UpdateSourceTrigger.Explicit, обновление источника не происходит, если не вызывается UpdateSource ().
До сих пор я не нашел способа подавить это обновление источника. Я старался
NotifyOnSourceUpdated = true
с
private void PasswordEntry_SourceUpdated(object sender, DataTransferEventArgs dataTransferEventArgs)
{
...
// Cancel this source update
dataTransferEventArgs.Handled = true;
}
но это не сработало, т.е. источник все еще обновлялся (со значением NULL).
Это ошибка WPF? У кого-нибудь была такая же проблема?
1 ответ
Я обнаружил, что использование привязки TwoWay решает мою проблему и не приводит к неожиданному обновлению исходного кода. Тем не менее, я до сих пор не понимаю, почему эта первоначальная цель обновления исходного кода выполнена. Я полагаю, что для этого есть техническая причина.