我有一些输入字段的TextBox和一个" Save"按钮在我看来。其中两个TextBox是保存所必需的字段,我在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>
&#34; Save&#34; Button链接到DelegateCommand,后者调用SaveScript()函数。如果两个必填字段的属性为空,则该功能不允许用户保存:
public void SaveScript()
{
if (this.ScriptFileName.Length > 0 && this.ScriptFileMap.Length > 0)
{
// save function logic
}
}
但是,该功能仍然允许保存文件。仔细观察,我发现当ValidationRule失败时,这两个字段(ScriptFileName和ScriptFileMap)的值没有被更新,并且它超过了最后的已知值。
这是ValidationRule的预期行为还是我在某处丢失了某些东西或出现故障?如果是前者,有没有办法覆盖这种行为?如果空字符串永远不会传递到绑定属性,我无法阻止ViewModel中的保存。
答案 0 :(得分:6)
是的,这是预期的行为。默认情况下,验证规则在原始建议值上运行,即转换之前的值并写回绑定源。
尝试将规则的ValidationStep
更改为UpdatedValue
。这应该强制规则在转换和写回新值后运行。
答案 1 :(得分:3)
您应该实现CanExecute
方法和RaiseCanExecuteChanged
事件,这将使您的按钮保持禁用状态,直到所有必需的属性都通过验证逻辑。
答案 2 :(得分:1)
由于我从来没有正确地使用ValidationRule,我采用了不同的方法并且只使用了许多绑定。这是我的文本框,包含文本,边框和工具提示的绑定:
<TextBox Text="{Binding Path=ScriptFileName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" BorderBrush="{Binding Path=ScriptFileNameBorder, UpdateSourceTrigger=PropertyChanged}" ToolTip="{Binding Path=ScriptFileNameToolTip, UpdateSourceTrigger=PropertyChanged}" />
这是我对文本字段的绑定,我自己更新边框和工具提示的逻辑(没有验证):
public string ScriptFileName
{
get
{
return this.scriptFileName;
}
set
{
this.scriptFileName = value;
RaisePropertyChanged(() => ScriptFileName);
if (this.ScriptFileName.Length > 0)
{
this.ScriptFileNameBorder = borderBrushNormal;
this.scriptFileNameToolTip.Content = "Enter the name of the file.";
}
else
{
this.ScriptFileNameBorder = Brushes.Red;
this.scriptFileNameToolTip.Content = "File name is required for saving.";
}
}
}
这样做可以让我得到我想要的用户反馈(红色边框和工具提示消息),当盒子留空时仍然使用我的SaveScript函数中的代码来防止“保存”按钮工作。
这是一个更多的打字,因为我需要为我想要的每个额外的字段都有单独的属性,但我尝试过的其他任何东西都没有效果或打破了程序中的其他东西(包括ValidationRules和DataTriggers )。