簡體   English   中英

EF實體類的可觀察/通知的派生/計算屬性

[英]Observable / notifying derived / computed property of EF entity class

我正在嘗試在WPF應用程序中使用.NET實體框架。 我有一些模型類,這些模型類根據各種屬性在某些列表中應該是可見的還是不可見的。 對於單個屬性(例如bool屬性),到目前為止,我可以使用Converter將bool值轉換為Visibility

下一個挑戰是,我需要執行更復雜的操作以確定模型元素是否應可見。 一個典型的示例可能如下所示:

public bool IsVisibleInProjectView
{
    get { return (!IsDeleted && IsSelectedForDisplay && Milestones.Any(ms => ms.IsVisibleInProjectView)); }
}

我能夠將此方法添加到生成的部分類中,並使用Binding來影響可見性。 但是,這樣做有一個缺點:只要更改了基礎屬性之一,就不會通知正在監聽“派生屬性”的任何人。 我發現了一些建議手動觸發OnPropertyChanged事件的答案,但是生成的EF類非常輕巧,似乎沒有實現接口INotifyPropertyChanged (不再嗎?)似乎我在這里缺少了一些東西-如果EF實體不是發出通知的人是誰?

我也曾嘗試向模型中添加計算屬性(我使用的是模型優先方法),但基本上陷入了困境,並遇到了同樣的問題:只要基本屬性之一發生變化,我將如何更新計算屬性?

當我發布一個演示非常簡單的MVVM的答案時,請參考此處 如果您查看我的視圖模型如何包裝HomePage和SettingsPage模型,則您的視圖模型可以類似的方式工作並包裝EF模型。 這樣,您的EF模型可以非常輕巧,並且不需要實現INPC。

如果您在模型上確實具有計算屬性,則視圖模型將“包裝”該屬性以將其公開給您的xaml視圖-類似於其包裝常規屬性的方式。

具體來說,您可以將這些方法放在viewmodel類中

public EfModelClass Model { get; private set; }

private bool _isVisibleInProjectView;

public bool IsVisibleInProjectView
{
    get { return _isVisibleInProjectView; }
    set { _isVisibleInProjectView; OnPropertyChanged("IsVisibleInProjectView");}
}

private void UpdateVisibility()
{
    IsVisibleInProjectView = 
        (!IsDeleted && IsSelectedForDisplay 
        && Milestones.Any(ms => ms.IsVisibleInProjectView));
} 

public bool IsDeleted 
{
    get { return Model.IsDeleted; }
    set 
    { 
        Model.IsDeleted = value; 
        OnPropertyChanged("IsDeleted");
        UpdateVisibility(); // This will change your IsVisibleInProjectView and notify the UI
    }
}  

... 

當我學習MVVM時,Rachel的本教程也對我有很大幫助。

暫無
暫無

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

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