首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValidationRules

ValidationRules
EN

Stack Overflow用户
提问于 2013-07-03 03:25:31
回答 1查看 259关注 0票数 2

在wpf视图中,我有3个实现自定义验证规则的文本框,如下所示:

代码语言:javascript
复制
<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模式

很抱歉我的英语,非常感谢你的回复。

EN

回答 1

Stack Overflow用户

发布于 2013-07-03 04:05:44

我认为这个问题可能发生的唯一方式是,当文本是从视图模型而不是从UI设置时,这种情况下这确实是一个问题,因为验证规则不会被重新计算。

要解决这个问题,您可以实现IDataErrorInfo interface,或者更好的方法是实现INotifyDataErrorInfo interface (如果您的目标是.NET 4.5)。这不仅可以解决您的问题,而且也是执行验证的MVVM方式(您当前使用XAML定义验证逻辑,这并不好)。完成此操作后,还可以从XAML中删除绑定规则。

实现示例:

代码语言:javascript
复制
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;
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17434132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档