【发布时间】:2017-11-14 16:10:40
【问题描述】:
我的 xaml 代码:
<StackPanel>
<TextBox>
<TextBox.Text>
<Binding Path="ContactNumber"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validators:ContactValidation ValidatesOnTargetUpdated = "True" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<Button Command="{Binding SaveContact}"/>
我的视图模型(已经实现了 Inotify Fody Weaver,ICommand 的标准中继命令实现)
public class DemoVM{
public string ContactNumber{get;set;}
public ICommand SaveContact=new RelayCommand(()=> //Simulate Db save of (ContactNumber));
}
我的验证类
public class ContactValidation : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (//some regex match)
return ValidationResult.ValidResult;
else
return new ValidationResult(false,"Error message")
}
}
每次验证规则返回有效结果时,都会更新 ContactNumber 属性。当验证规则返回无效结果时,ContactNumber 属性是其最后验证的值。 我如何继续验证代码的 xaml(显示错误消息等)端以及我的视图模型中的所有值(如果显示错误则防止提交或仅在所有字段都验证后才启用按钮)?
MSDN 的官方数据绑定文档分别涵盖了验证部分,但如果我们想使用相同的验证规则从 UI 和代码背后的角度进行验证,则没有任何内容。
【问题讨论】:
-
ValidationRules 将验证置于视图领域,而视图模型“不知道”它。如果你想让 viewmodel 参与进来,请在 viewmodel 上实现
IDataErrorInfo。
标签: c# wpf validation xaml data-binding