[英]Validation in WPF MVVM with Entity Framework
我正在使用Visual Studio 2015編寫WPF MVVM Light應用程序。數據已經使用Entity Framework 6引入,使用數據庫優先生成模型。 在我的MainViewModel.cs文件中,我想在執行SaveChanges()
之前驗證數據。
我見過的例子談到了為模型添加注釋(例如, 這個 ); 但是,我正在使用自動生成的Entity Framework模型。 我的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
的字段。
這是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
,而firstName
和lastName
是必需的,等等。如何完成此驗證並向用戶顯示錯誤?
我假設當您向用戶顯示您正在使用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;
}
}
此外,您可以在任何驗證規則失敗時禁用“保存”按鈕。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.