簡體   English   中英

CurrentValues.SetValues 不會引發 INotifyPropertyChanged

[英]CurrentValues.SetValues doest not raise INotifyPropertyChanged

我正在我的 EF POCO 上實現INotifyPropertyChanged接口。

我有一個 function 來重置更改:

var entry = db.Entry(c);
entry.CurrentValues.SetValues(entry.OriginalValues);

但它不調用INotifyPropertyChanged 它根本不調用 setter。

也許有更好的方法來重置實體?

我正在我的 EF POCO 上實現 INotifyPropertyChanged 接口。

這意味着您使用實體類作為視圖模型。 從該設計決策可以推測,為了防止保存更改,當用戶取消編輯時必須重置實體。

但它不調用 INotifyPropertyChanged。

您注意到未調用 setter 可能意味着 UI 元素也必須收到有關此重置的通知。

現在你可以做兩件事:修復設置器的繞過,或者修復設計。

修復二傳手

EF 核心繞過設置器,因為默認情況下它會嘗試使用支持字段 阻止 EF 這樣做很容易。 您可以打破 EF 遵循的命名約定,或者告訴它不要完全查看它。 EF 不會在這樣的代碼中找到支持字段:

private string _titleField;

public string Title
{
    get { return _titleField; }
    set
    {
        _titleField = value;
        // notification code
    }
}

但從代碼本身來看,為什么該字段有如此奇怪的名稱並不明顯。 它很容易被遺忘。

如果您希望 EF 使用設置器,則應顯式配置它:

modelBuilder.Entity<Post>().Property(p => p.Title)
    .UsePropertyAccessMode(PropertyAccessMode.PreferProperty);

但這也意味着當 EF 實現實體 object 時將發送更改通知。 (但在那一刻可能還沒有人聽)。

修復設計

IMO,改變設計會更好。 在 UI 中使用視圖 model class(帶有INotifyPropertyChanged )僅在確認保存時將其更改傳輸到基礎實體 class。 現在,如果用戶取消更改,您只需丟棄(或使用通知重置)視圖 model 即可完成。 永遠不需要“重置實體”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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