簡體   English   中英

使用實體框架在WPF MVVM中進行驗證

[英]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 ,而firstNamelastName是必需的,等等。如何完成此驗證並向用戶顯示錯誤?

我假設當您向用戶顯示您正在使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM