1

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 のバグですか? 誰かが同じ問題を抱えていましたか?

4

1 に答える 1

0

TwoWay バインディングを使用すると問題が解決し、予期しないソース更新が行われないことがわかりました。ただし、この最初のターゲットからソースへの更新が行われる理由はまだよくわかりません。これには技術的な理由があると思います。

于 2011-04-21T06:40:22.477 に答える