刷新SaveChanges

时间:2015-07-06 19:30:43

标签: c# wpf entity-framework-4

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

现在我想知道,我在列表窗口中检测到我在编辑窗口中调用SaveChanges后编辑了上下文的方法?

我目前所做的是在我的列表窗口对象上使用公开Update方法,我在{{1>之后从编辑窗口调用该方法调用并在该函数中调用上下文刷新。然而,这是不可扩展的,因为我需要跟踪依赖于Book信息的所有窗口(例如,如果我添加Shelves列表,我将需要确保也更新那个)。

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

P.S。 有趣的是,我似乎已经知道如何改进这个2年前,当我第一次编写这段代码时,我为自己做了评论:" TODO:通过在ArTresorEntities中进行事件来解决这个问题&#34 ;。但我不记得我的意思。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以通过在模型类上实现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属性中。如果您运行此代码,则每次单击按钮时都会更新标签。