刷新 SaveChanges 上的所有上下文

Refresh all contexts on SaveChanges

我有一个 WPF 应用程序,其中有两个 windows。一种用于列出 对象(例如书籍),另一种用于编辑 一个对象(例如一本书)。我为每个 windows 创建了一个新的 EF 上下文。

现在我想知道,有没有一种方法可以在 list window 中检测到在我调用 SaveChanges 编辑 window?

我现在所做的是在我的 list window 对象上有一个 public Update edit window 在调用 SaveChanges 之后,在该函数中我调用了上下文刷新。然而,这是不可扩展的,因为我需要跟踪所有依赖于书籍信息的 windows(例如,如果我添加 Shelves 列表,我需要确保也更新那个)。

关于如何以更模块化的方式解决这个问题有什么建议吗?

P.S。 有趣的是,2 年前,当我第一次编写这段代码时,我似乎已经想到了如何改进它,因为我为自己发表了评论:"TODO: solve this differently by having events in ArTresorEntities"。但是我不记得我的意思了。

使用 MVMM Light 您可以发送消息。您的列表 Window 注册接收消息,后者通知它有关更改。看看here.

您可以通过在您的模型 class 上实施 INotifyPropertyChanged 然后将该值绑定到您的 label/interface 控件来实现。

这是一个示例模型 class:

public class Data : INotifyPropertyChanged
{
    int random;

    public int Random
    {
        get { return random;  }
        set { random = value; NotifyPropertyChanged("Random"); }
    }

    protected void NotifyPropertyChanged(String propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged;

}

这就是实现 INotifyPropertyChanged 所需的全部内容。请注意,您必须在 属性 的 set 方法期间调用 NotifyPropertyChanged,否则这将不起作用。

On the UI side, you would do something like this:

<Grid>
    <Label Content="{Binding Random, UpdateSourceTrigger=PropertyChanged}" />
    <Button Width="100" Height="40" Content="Randomize" Click="Button_Click" />
</Grid>

最后,xaml 的代码隐藏:

    public Data data;
    public MainWindow()
    {
        InitializeComponent();
        data = new Data();
        this.DataContext = data;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        data.Random = new Random().Next(1000);
    }

被分配的 DataContext 只是一个例子,但它将这个特定的 class 绑定到这个 window 的 dataContext,允许我执行{Binding Random}并知道哪个 属性 我说的是其中 class。您可以通过几种方式执行此操作,并将其拆分到一个视图中。

我还添加了一个生成随机数的按钮,并将其设置在我模型上的随机 属性 中。如果您 运行 此代码,它会在您每次单击按钮时更新标签。