我有几个输入框和视图中的“保存”按钮。其中两个文本框是保存所必需的字段,我在xaml中为一些视觉反馈(红色边框和工具提示)设置了一个自定义validationrule,如下所示:
<TextBox ToolTip="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}">
<TextBox.Text>
<Binding Path="ScriptFileMap" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<v:MinimumStringLengthRule MinimumLength="1" ErrorMessage="Map is required for saving." />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
“保存”按钮链接到调用savescript()函数的delegatecommand。如果两个必需字段的属性为空,则此函数不允许用户保存:
public void SaveScript()
{
if (this.ScriptFileName.Length > 0 && this.ScriptFileMap.Length > 0)
{
// save function logic
}
}
但是,该函数仍然允许保存文件。仔细观察,我发现当validationrule失败时,这两个字段(scriptfilename和scriptfilemap)的值不会被更新,而是按照最后一个已知的值进行更新。
这是validationrule的预期行为,还是我在某个地方缺少了什么或出现了故障?如果是前者,有没有办法克服这种行为?如果从未将空字符串传递到绑定属性中,则无法阻止在viewmodel中进行保存。
最佳答案
是的,这是预期的行为。默认情况下,验证规则在原始建议值上运行,即在转换该值并将其写回绑定源之前运行。
尝试将规则上的ValidationStep
更改为UpdatedValue
。这将强制规则在转换并写回新值之后运行。