我有几个输入框和视图中的“保存”按钮。其中两个文本框是保存所必需的字段,我在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。这将强制规则在转换并写回新值之后运行。

08-26 19:05