c#-使用实体框架在WPF MVVM中进行验证

我正在使用Visual Studio 2015编写WPF MVVM Light应用程序.数据是使用Entity Framework 6引入的,使用数据库优先生成模型.在我的MainViewModel.cs文件中,我想在执行SaveChanges()之前验证数据.

我看过的示例都是关于向模型添加注释的(例如this).但是,我使用的是自动生成的实体框架模型.我的ViewModels参考ObservableCollection< Employee>对象-没有东西直接引用字段,因此我可以在它们上添加注释.

这是SearchResults属性,其中包含从EF返回的结果:

private ObservableCollection<Employee> _searchResults;
public ObservableCollection<Employee> SearchResults
{
    get { return _searchResults; }
    set
    {
        if (_searchResults == value) return;

        _searchResults = value;
        RaisePropertyChanged("SearchResults");
    }
}

搜索后将填充SearchResults并将其绑定到DataGrid:

var query = Context.Employees.AsQueryable();

// Build query here...

SearchResults = new ObservableCollection<Employee>(query.ToList());

用户单击DataGrid上的一行,我们将显示详细信息以供他们更新.然后,他们可以单击“保存”按钮.但是我们想在执行Context.SaveChanges()之前验证每个Employee中的字段.

这是由实体框架自动生成的部分类Employee的相关区域:

public int employeeID { get; set; }
public int securityID { get; set; }
public string firstName { get; set; }
public string middleName { get; set; }
public string lastName { get; set; }
public string suffix { get; set; }
public string job { get; set; }
public string organizationalUnit { get; set; }
public string costCenter { get; set; }
public string notes { get; set; }
public System.DateTime createdDate { get; set; }

例如,securityID不能为空,并且必须为int,而firstName和lastName是必需的,等等.如何完成此验证并将错误显示给用户?

解决方法:

我假设当向用户显示使用TextBoxes的详细信息时(您可以将相同的解决方案应用于其他控件).

在用户更改Employee的属性之后,无需验证数据,而只是事先进行验证,并且即使这些属性无效也不要更改.

您可以使用ValidationRule类轻松完成此操作.例如:

<ListBox ItemsSource="{Binding Employees}" Name="ListBoxEmployees">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"></TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
<TextBox>
    <TextBox.Text>
        <Binding ElementName="ListBoxEmployees" Path="SelectedItem.Name" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <*:NotEmptyStringValidationRule/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

和验证规则:

public class NotEmptyStringValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        string s = value as string;
        if (String.IsNullOrEmpty(s))
        {
            return new ValidationResult(false, "Field cannot be empty.");
        }

        return ValidationResult.ValidResult;
    }
}

当任何验证规则失败时,您也可以禁用“保存”按钮.

上一篇:php-Laravel请求验证在版本5.2中抛出HttpResponseException


下一篇:Java-Grails:验证文件上传