我正在使用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;
}
}
当任何验证规则失败时,您也可以禁用“保存”按钮.