Привязка WPF (dataGrid) OneWayToSource, UpdateSourceTrigger-Explicit - нежелательное обновление источника - PullRequest
0 голосов
/ 20 апреля 2011

У меня проблема с нежелательным обновлением источника в сценарии 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? У кого-нибудь была такая же проблема?

1 Ответ

0 голосов
/ 21 апреля 2011

Я обнаружил, что использование привязки TwoWay решает мою проблему и не выполняет неожиданное обновление исходного кода. Тем не менее, я до сих пор не понимаю, почему эта первоначальная цель для обновления исходного кода выполнена. Я полагаю, что для этого есть техническая причина.

...