我正在使用Visual Studio 2015编写WPF MVVM Light应用程序。数据已使用Entity Framework 6引入,使用数据库优先生成模型。在我的MainViewModel.cs文件中,我想在执行SaveChanges()
之前验证数据。
我见过的例子谈到了为模型添加注释(例如,this);但是,我使用自动生成的Entity Framework模型。我的ViewModel引用了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上的一行,我们会显示要更新的详细信息。然后他们可以点击“保存”按钮。但我们希望在执行Employee
之前验证每个Context.SaveChanges()
中的字段。
这是由实体框架自动生成的部分类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
是必需的,等等。如何完成此验证并向用户显示错误?
答案 0 :(得分:3)
我假设您向用户显示您正在使用的详细信息TextBox
es(您可以对其他控件应用相同的解决方案)。
在用户更改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;
}
}
当任何验证规则失败时,您也可以禁用“保存”按钮。