使用Entity Framework在WPF MVVM中进行验证

3
我正在使用Visual Studio 2015编写WPF MVVM Light应用程序。使用数据库优先生成模型,使用Entity Framework 6将数据引入。在我的MainViewModel.cs文件中,我希望在执行SaveChanges()之前验证数据。
我看到的示例都是关于向模型添加注释(例如,this);但是,我正在使用自动生成的Entity Framework模型。我的ViewModels引用ObservableCollection<Employee>对象--没有直接引用字段,因此无法在它们上面放置注释。
这里是保存从EF返回的结果的SearchResults属性:
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中的字段。
以下是由Entity Framework自动生成的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类型,而firstNamelastName是必需的等。如何完成此验证并向用户显示错误?
1个回答

3

我猜当你向用户展示细节时,你使用TextBox(你可以将相同的解决方案应用于其他控件)。

不要在用户更改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>
                <stackOverflow: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;
    }
}

您可以在任何验证规则失败时禁用保存按钮。

谢谢,@qqww2。我该如何在正在验证的字段旁边显示错误消息? - Alex
查找Validation.ErrorTemplate这里有一个很好看的模板。 - Yusuf Tarık Günaydın

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接