【问题标题】:Using DependencyProperty on ViewModel with Entity Framework在带有实体框架的 ViewModel 上使用 DependencyProperty
【发布时间】:2026-01-03 02:10:01
【问题描述】:

我正在使用带有实体框架模型的 MVVM 模式用 C# 编写桌面应用程序。我倾向于在我的 VM 中使用 DependencyProperties,并且(通常)更喜欢这个系统而不是实现 INotifyPropertyChanged。我想保持一致。我的虚拟机访问模型中的实体,并且我设法将事情分开 - 除了绑定和命令名称之外,视图对虚拟机一无所知,而模型对虚拟机了解。

在 VM 中使用 INotifyPropertyChanged,更新模型中的实体似乎很容易:

public string Forename
    {
        get { return CurrentPerson.Forename; }
        set
        {
            if (Forename != value)
            {
                CurrentPerson.Forename = value;
                NotifyPropertyChanged("Forename");
            }
        }
    }

...其中 CurrentPerson 是由实体数据模型自动创建的 Person 对象。因此没有专门为存储名字而创建的私有字段。

使用 DependencyProperties,看来我必须创建一个 DP,使用 GetValue 和 Setvalue 添加默认属性,然后使用 PropertyChangedCallback 来更新 CurrentPerson 实体。为了与我的其他 VM 保持一致,在这种情况下调用回调似乎会增加开销。

因此,问题是这些方法中的一种或另一种是我应该做事的方式吗?在这种情况下,我应该使用 DependencyProperty 还是 INotifyPropertyChanged?应该指出的一件事是,这可能是一个非常大规模的项目(带有插件和来自不同机器的大量数据库访问),并且所有东西都应该是可重用的,并且模块尽可能“断开连接” .

【问题讨论】:

  • 在视图模型中使用依赖属性有什么好处?换句话说 - 它带来了INotifyPropertyChanged 没有提供的额外价值。
  • 我正在寻找良好的速度和 DP 附带的良好绑定功能。请记住,我在我的视图中使用 XAML 直接绑定到 DP。也可能会频繁发生财产价值变化。从我之前找到的参考资料来看,为了加快装订速度,DP 是要走的路。我的设计的其余部分也有一致性。但是,如果所有这些回调通过对 Entity 对象的单独修改来否定它,那么这一切都没有任何好处。

标签: c# wpf entity-framework dependency-properties inotifypropertychanged


【解决方案1】:

我建议使用 INotifyPropertyChanged 而不是 DependencyProperty。我远离 ViewModels 中的 DependencyProperty 的主要原因是 DependencyProperty 位于 WindowsBase.dll 中。这将您与 Windows UI 联系得太紧密了(至少恕我直言)。

使用 INotifyPropertyChanged 更容易维护,因为它允许各种插件以他们想要的方式实现它。如果你强制依赖属性,所有的视图模型都需要从 DependencyObject 继承。

有关 INotifyPropertyChanged 和 DependencyProperty 使用的更多详细信息,请参阅本文:http://kentb.blogspot.com/2009/03/view-models-pocos-versus.html

另一个支持答案:https://*.com/a/783154/27669

【讨论】:

  • 谢谢。我认为 INotifyPropertyChanged 将是要走的路,尽管事件具有在 INotifyPropertyChanged 中使用“魔术字符串”的各种保护措施,但我仍然发现 DP 更优雅。我提出这个观点的两个主要原因是:1) 与 DP 的状态复制和 2) 我有时需要更改整个对象状态的事实,我可以简单地使用 PropertyChanged(null) 来做到这一点。感谢您的回答和参考。
  • 与 Windows UI 的耦合可能是一个主要问题 .. 刚刚修复了一个项目,其中相同的 dll 用于 Web 服务但依赖属性坚持它在 UI 线程上运行,这在多线程 Web 服务。这种架构灵活性(即在您的实体 Dll 中缺乏与 Windows GUI 的紧密耦合)远比 GUI 的优雅重要。
最近更新 更多