可观察/通知EF实体类的派生/计算属性

时间:2014-03-09 22:37:53

标签: c# wpf entity-framework

我正在尝试在WPF应用程序中使用.NET Entity Framework。我有一些模型类,根据不同的属性,在某些列表中应该是可见的或不可见的。对于单个属性 - 例如,bool属性 - 我能够使用转换器将bool值转换为Visibility - 到目前为止很好。

接下来的挑战是我需要实现更复杂的操作来确定模型元素是否应该可见。典型示例可能如下所示:

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

我能够将此方法添加到生成的分部类中,并使用Binding来影响可见性。但是,这有一个缺点:每当更改其中一个底层属性时,不会通知任何正在侦听“派生属性”的人。我找到了几个建议手动触发OnPropertyChanged事件的答案,但生成的EF类非常轻量级,似乎没有实现接口INotifyPropertyChanged(不再?)似乎我在这里遗漏了一些东西 - 如果EF实体不是发出通知的实体,那么谁是?

我还试图向模型中添加一个计算属性(我使用的是模型优先方法),但基本上是完整的循环并遇到了同样的问题:如果其中一个,我将如何更新计算属性基本属性改变了吗?

1 个答案:

答案 0 :(得分:1)

请参阅here,因为我发布了一个演示非常简单的MVVM的答案。如果您查看我的视图模型如何包装HomePage和SettingsPage模型,您的视图模型可以以类似的方式工作并包装您的EF模型。这样,您的EF模型可以非常轻量级,无需实现INPC。

如果你在模型上有一个计算属性,你的viewmodel将只是" wrap"该属性将其暴露给您的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的tutorial对我帮助很大。