在 wpf View 中,我有 3 个文本框,它们实现如下自定义验证规则:
<TextBox HorizontalAlignment="Left"
Height="30"
Grid.Row="2"
Grid.Column="1"
TextWrapping="Wrap"
VerticalAlignment="Top"
Width="150"
Validation.ErrorTemplate="{StaticResource ValidationTemplate}">
<TextBox.Text>
<Binding Path="Model.Age"
Mode="TwoWay"
UpdateSourceTrigger="PropertyChanged"
ValidatesOnExceptions="True"
ValidatesOnDataErrors="True">
<Binding.ValidationRules>
<validation:DataTypeValidationRules DataTypeRule="Required"
ErrorMessage="Required field" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
我的问题是:如果我直接在文本框中更改文本,则验证工作,如果文本框没有值,我可以看到我的模板,但如果我在 View 中不执行任何操作并单击我的保存按钮,该按钮有一个命令绑定(bind)到我的 ViewModel,验证不起作用,因为我认为没有引发 OnPropertyChange 事件,所以我需要再次检查我的 View 模型中的值是否不为空,并且我不想这样做那个。
注意:我使用的是 MVVM 模式
抱歉我的英语不好,非常感谢您的回复。
最佳答案
我能想到发生此问题的唯一方法是当从 View 模型而不是从 UI 设置文本时,在这种情况下这确实是一个问题,因为验证规则不会被重新评估。
要解决此问题,您可以实现 IDataErrorInfo
interface ,或者更好的是 INotifyDataErrorInfo
interface (如果您的目标是 .NET 4.5)。这不仅可以解决您的问题,而且也是执行验证的 MVVM 方式(您当前在 XAML 中定义验证逻辑,这不好)。执行此操作后,您还可以从 XAML 中删除绑定(bind)规则。
实现示例:
public class ViewModel : IDataErrorInfo
{
public string Error
{
get { return null; }
}
public string this[string propertyName]
{
get
{
if (propertyName == "Age")
{
if (Age < 18)
{
return "Age must be at least 18.";
}
}
return null;
}
}
}
关于c# - 验证规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17434132/