c# - 当 ViewModel 中的实体模型发生变化时更新 UI

标签 c# wpf entity-framework mvvm data-binding

我正在尝试想出一种使用 Entity-Framework 实现 MVVM 模式的好方法,其中我的实体是我的模型。我的 DataContext 是我的 View 模型。这是问题的一个小重现。

查看

<TextBox Text="{Binding MyText}" />

View 模型:

我需要从我的数据库中逐条记录地导航。单击 View 中的按钮时,将向执行 nextRecord() 的 View 模型发送命令。 EF 施展魔法,_myObject 是数据库中的下一行/记录

public class myViewModel: INotifyPropertyChanged
{
    private MyEntityObject _myObject;

    public string MyText
    {
        get { return _myObject.MyText; }
        set
        {
            if (_myObject.MyText != value)
            {
                _myObject.MyText = value;
                OnPropertyChanged("MyText");
            }
        }
    }

    private void _nextRecord()
    {
      _myObject = myEntitiesContext.NextRecord() //pseudocode
    }
}

自动生成的实体模型

public partial class MyEntityObject
{
     public string MyText { get; set; }
}

由于 View 不知道 _myObject 的变化,它不会在 _myObject 变化时更新。我想到的几种方法。

  1. 我还没有测试过将我的实体包装在 INotifyPropertyChanged 包装器类中,但由于我有很多实体对象,所以我谨慎地这样做。

  2. 我可以为所有属性调用 OnPropertyChanged("..."),但我的一些实体有很多属性,这会很难看。可以使用反射使其更清晰,但我可能拥有未数据绑定(bind)的属性。

  3. 我可能能够将其推迟到 UI,在我单击“下一条记录”时以某种方式刷新绑定(bind),但这会破坏 MVVM 并且看起来很脏

如何让 UI 识别来自 _myObject 的更改?

最佳答案

正如我在评论中提到的,调用 OnPropertyChanged("")OnPropertyChanged(null) 会使所有属性无效,等同于调用 OnPropertyChanged 为每个属性。此行为也是 documented here :

The PropertyChanged event can indicate all properties on the object have changed by using either null or String.Empty as the property name in the PropertyChangedEventArgs.

这意味着您可以在更新对象时简单地添加对 OnPropertyChanged("") 的调用,以强制 WPF 重新评估与 View 模型的所有绑定(bind):

private void _nextRecord()
{
    _myObject = myEntitiesContext.NextRecord();
    OnPropertyChanged("");
}

话虽如此,我仍然会使用@Anand 的解决方案 (+1)。关于 View 模型是否可以将模型公开为属性的争论一直在进行,我倾向于公开它,直到您需要引入一些特定于 View 模型的逻辑。大多数时候您不必这样做,也不值得包装模型属性。

关于c# - 当 ViewModel 中的实体模型发生变化时更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18863943/

相关文章:

c# - 即使内容比容器高,WPF 控件也会对齐到底部

c# - WPF 全局类 MVVM

c# - 如何知道使用 Entity Framework 4.1 的 asp.net MVC3 应用程序当前打开了多少个连接

c# - EF 更新当前迁移文件而不是创建新文件

c# - 从后台线程更新 UI - 我怎么知道我的 GUI 没有被处理掉?

c# - Date.AddDays 没有给出正确答案

c# - 如何让这个 CLR 与 2005 一起工作?

c# - 字符串被神秘地切断

c# - C#如何打开新窗口

entity-framework - 批量更新/删除EF5