【问题标题】:Observable / notifying derived / computed property of EF entity classEF 实体类的可观察/通知派生/计算属性
【发布时间】:2014-04-12 21:45:24
【问题描述】:

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

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

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

我能够将此方法添加到生成的部分类并使用绑定来影响可见性。然而,这有一个缺点:无论何时更改基础属性之一,都不会通知正在监听“派生属性”的人。我找到了几个建议手动触发 OnPropertyChanged 事件的答案,但是生成的 EF 类非常轻量级,似乎没有实现接口 INotifyPropertyChanged (还有吗?)似乎我在这里遗漏了一些东西 - 如果 EF实体不是发出通知的人,谁是?

我还尝试向模型添加计算属性(我使用的是模型优先方法),但基本上绕了一圈并遇到了同样的问题:我如何更新计算属性基础属性变化?

【问题讨论】:

  • 如果你想这样做,遵循 MVVM 方法可能更容易。即拥有一个轻量级模型,并创建一个将实现 INPC 的 ViewModel 类。 viewmodel 类将负责发出通知。另一种选择是在 XAML 端使用具有多个数据触发器的样式来控制可见性。
  • @failedprogramming 你能推荐一个好的介绍或教程吗?我一直在寻找一些东西,但我发现的大部分东西要么过于简单,要么与 EF 根本无关......

标签: c# wpf entity-framework


【解决方案1】:

请参考here,因为我发布了一个演示非常简单的 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
    }
}  

... 

Rachel 的 tutorial 在我学习 MVVM 时也给了我很多帮助。

【讨论】:

    猜你喜欢
    • 2017-04-25
    • 2020-11-20
    • 2016-04-22
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多