我在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是
的用户控件并等待用户单击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错误吗? 有没有人有同样的问题?
答案 0 :(得分:0)
我发现使用TwoWay绑定解决了我的问题并且没有进行意外的源更新。但是,我仍然不明白为什么要完成源更新的初始目标。我认为这有一个技术原因。