Привязка 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 решает мою проблему и не приводит к неожиданному обновлению исходного кода. Тем не менее, я до сих пор не понимаю, почему эта первоначальная цель обновления исходного кода выполнена. Я полагаю, что для этого есть техническая причина.

Другие вопросы по тегам