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 };
また、編集モードで 2 つの 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 は、ユーザー コントロールです。
- 「SelectedPasswordProperty」という名前の DependencyProperty があります
ユーザーが OKButton をクリックするのを待ってから、いくつかの検証を行います (2 つの PasswordBox の内容は同じですか?)。検証に問題がない場合は、次のコードを介して UpdateSource を呼び出します
BindingExpression be = this.GetBindingExpression(SelectedPasswordProperty); if (be != null) { be.UpdateSource(); }
ソースの更新は問題ありません。
問題は、セル編集テンプレート (PasswordEntry UserControl) が開かれると、「NULL」の値を持つ望ましくないソース更新が 1 つあることです。
UpdateSourceTrigger = UpdateSourceTrigger.Explicit が使用されている場合、UpdateSource() が呼び出されない限り、ソースの更新はないと予想しました。
これまでのところ、このソースの更新を抑制する方法は見つかりませんでした。私は試した
NotifyOnSourceUpdated = true
と
private void PasswordEntry_SourceUpdated(object sender, DataTransferEventArgs dataTransferEventArgs)
{
...
// Cancel this source update
dataTransferEventArgs.Handled = true;
}
つまり、ソースがまだ (NULL 値で) 更新されていました。
これは WPF のバグですか? 誰かが同じ問題を抱えていましたか?