У меня проблема с нежелательным обновлением источника в сценарии 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, а затем выполнит некоторую проверку (идентично ли содержимое двух паролей паролей?). Если проверка в порядке, вызывает UpdateSource с помощью следующего кода
BindingExpression be = this.GetBindingExpression (SelectedPasswordProperty);
если (быть! = ноль)
{
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?
У кого-нибудь была такая же проблема?