在wpf视图中,我有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>我的问题是:如果我直接在textbox中更改文本,验证工作,如果textbox没有值,我可以看到我的模板,但如果我在视图中什么都不做,单击保存按钮,它有一个命令绑定到我的ViewModel,验证不起作用,因为我认为没有OnPropertyChange事件谁被引发,所以我需要再次检查我的视图模型中的值是否不为空,我不想这样做。
注意:我使用的是MVVM模式
很抱歉我的英语,非常感谢你的回复。
发布于 2013-07-03 04:05:44
我认为这个问题可能发生的唯一方式是,当文本是从视图模型而不是从UI设置时,这种情况下这确实是一个问题,因为验证规则不会被重新计算。
要解决这个问题,您可以实现IDataErrorInfo interface,或者更好的方法是实现INotifyDataErrorInfo interface (如果您的目标是.NET 4.5)。这不仅可以解决您的问题,而且也是执行验证的MVVM方式(您当前使用XAML定义验证逻辑,这并不好)。完成此操作后,还可以从XAML中删除绑定规则。
实现示例:
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;
}
}
}https://stackoverflow.com/questions/17434132
复制相似问题