刷新SaveChanges上的所有上下文

本文关键字:上下文 SaveChanges 刷新 | 更新日期: 2023-09-27 18:01:20

我有一个WPF应用程序,我有两个窗口。一个用于列出对象(例如Books),另一个用于编辑对象(例如Book)。我为每个窗口创建了一个新的EF上下文。

现在我想知道,是否有一种方法可以在列表窗口中检测到在编辑窗口中调用SaveChanges后已编辑上下文?

我现在做的是在我的列表窗口对象上有一个公共Update方法,我在SaveChanges被调用后从编辑窗口调用,并在该函数中调用上下文刷新。然而,这是不可扩展的,因为我需要跟踪所有依赖于Book信息的窗口(例如,如果我添加了书架列表,我也需要确保更新该列表)。

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

注:有趣的是,当我在2年前第一次编写这段代码时,我似乎已经有了如何改进这一点的想法,因为我为自己做了一个评论:"TODO:通过在ArTresorEntities中添加事件来解决这个问题"。但是我不记得我是什么意思了

刷新SaveChanges上的所有上下文

使用MVMM Light可以发送Message。您的列表窗口注册接收消息,然后通知它有关更改。

您可以通过在您的模型类上实现INotifyPropertyChanged,然后将值绑定到您的标签/接口控件来做到这一点。

下面是一个示例模型类:

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只是一个例子,但它将这个特定的类绑定到这个窗口的DataContext,允许我执行{Binding Random}并知道我在谈论哪个属性以及在哪个类中。您可以通过几种方式来实现这一点,并在整个视图中拆分它。

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