WPF绑定(dataGrid)OneWayToSource,UpdateSourceTrigger-Explicit - 不需要的源更新

时间:2011-04-20 12:23:00

标签: wpf binding wpfdatagrid frameworkelementfactory

我在OneWayToSource,UpdateSourceTrigger.Explicit场景中出现了不需要的源更新问题

背景: 我有一个包含用户数据和密码列的DataGrid。 我从DataGridTemplateColumn派生了类DataGridPasswordColumn到

在非编辑模式下显示一些虚拟蒙版数据(例如####) 这是通过将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是

的用户控件
  • 具有名为“SelectedPasswordProperty”
  • 的DependencyProperty
  • 并等待用户单击OKButton,然后进行一些验证(两个PasswordBox的内容是否相同?)。如果验证正常,请通过以下代码调用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 个答案:

答案 0 :(得分:0)

我发现使用TwoWay绑定解决了我的问题并且没有进行意外的源更新。但是,我仍然不明白为什么要完成源更新的初始目标。我认为这有一个技术原因。