c# - 验证规则

标签 c# .net wpf xaml mvvm

在 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/

相关文章:

c# - Microsoft.Office.Interop 用于网站(文件转换)是否安全?

c# - ASP .NET MVC 5 - 客户地址一对一关系

C# Mono+Winforms MessageBox问题

c# - datagrid 获取单元格索引

C# 检查 DataGridView 是否包含特定的单词

c# - 在对象的并行 linq 中指定任务超时

c# - 在返回 float 的方法中将结果转换为 float 会改变结果

.net - MVVM 从其他工作区(而不是主控制面板)打开新工作区

c# - 简单的 ListView 数据绑定(bind)

wpf - Silverlight 中的自定义形状(从 WPF 移植应用程序)