C# 在另一个ViewModel中完成数据库更改后,如何“刷新”我的ViewModels?
我目前正在使用MVVM方法编写一个相当小的桌面应用程序。它还利用实体框架6进行数据库访问。现在,我的顶级ViewModel实例化了“较小”的视图,并将我正在使用的DbContext传递给它们。我使用的较小的ViewModel对应于位于单独选项卡项中的UserControls。但是,如果我在一个选项卡中更改数据库中的某些内容,然后切换该选项卡,那么从逻辑上讲,UI就跟不上,因为没有发生OnPropertyChangedSomeObservableCollection 我想在TabItem激活时刷新里面的所有内容,但一方面,我不知道该怎么做,这基本上是在PropertyChanged上完成的。。对于每个与UI相关的属性,对吗?另一方面,它看起来既不优雅也不“正确” 我该怎么办?使用一个全局DbContext是否是一种好的做法?我读过关于短期DbContext实例更好的文章,但我也发现关于桌面应用程序的相反说法C# 在另一个ViewModel中完成数据库更改后,如何“刷新”我的ViewModels?,c#,wpf,entity-framework,mvvm,C#,Wpf,Entity Framework,Mvvm,我目前正在使用MVVM方法编写一个相当小的桌面应用程序。它还利用实体框架6进行数据库访问。现在,我的顶级ViewModel实例化了“较小”的视图,并将我正在使用的DbContext传递给它们。我使用的较小的ViewModel对应于位于单独选项卡项中的UserControls。但是,如果我在一个选项卡中更改数据库中的某些内容,然后切换该选项卡,那么从逻辑上讲,UI就跟不上,因为没有发生OnPropertyChangedSomeObservableCollection 我想在TabItem激活时刷新
您如何处理这种情况?事实上不会那么罕见吧?谢谢 您必须考虑使用Messenger MvvMLight或EventAggregator Caliburn.Micro
因此,当您的上下文发生更改时,您会传递有关它的消息并更新SomeObservableCollection等属性更改SomeObservableCollection将被引发。您必须使用Messenger MvvMLight或EventAggregator Caliburn.Micro
因此,当您的上下文发生更改时,您会传递有关它的消息,并更新SomeObservableCollection,因此属性ChangedSomeObservableCollection将被引发。可能会有所帮助。我在一个小项目中做过这个。欢迎任何更好的解决方案
**Viewmodel 1 Where changes occurs**
//database call
string result = _dataService.Insert(data);
if(result=="Success")
{
//notify viewmodels using default messenger instance
MessengerInstance.Send(new NotificationMessage("notifycollection"));
}
Viewmodel 2,我们在其中接收通知
也许会有帮助。我在一个小项目中做过这个。欢迎任何更好的解决方案
**Viewmodel 1 Where changes occurs**
//database call
string result = _dataService.Insert(data);
if(result=="Success")
{
//notify viewmodels using default messenger instance
MessengerInstance.Send(new NotificationMessage("notifycollection"));
}
Viewmodel 2,我们在其中接收通知
那根本不是一个容易的话题 如果处理少量数据,并且性能对您来说不是问题,那么可以在每次加载视图时更新绑定。你可以看到如何做到这一点 如果这样做的话,一个问题是,您必须执行一些额外的逻辑来保存最后选择的项,并在加载视图后重新选择它们
使用信使也是一种选择。但根据我的经验,如果没有正确地实施,信使可能会让思考变得混乱。例如,请不要使用一些神奇的字符串作为提示。这根本不是一个容易的主题 如果处理少量数据,并且性能对您来说不是问题,那么可以在每次加载视图时更新绑定。你可以看到如何做到这一点 如果这样做的话,一个问题是,您必须执行一些额外的逻辑来保存最后选择的项,并在加载视图后重新选择它们
使用信使也是一种选择。但根据我的经验,如果没有正确地实施,信使可能会让思考变得混乱。例如,请不要使用一些神奇的字符串作为提示。我不确定您会发现它在多大程度上直接适用,但我已经写了一篇与您的情况相关的文章。我不确定您会发现它在多大程度上直接适用,但我已经写了一些似乎与你的情况有关的东西。或者仅仅使用事件?提供相关的视图模型会保留彼此的实例。@BenjaminPaul,另一种方法。但是在测试中使用Messenger要简单一点,并且使用消息可以使viewmodels彼此分离。viewmodels不关心消息来自何处。当他们收到注册的消息时,他们只是做他们被要求做的事情。或者仅仅使用事件?提供相关的视图模型会保留彼此的实例。@BenjaminPaul,另一种方法。但是在测试中使用Messenger要简单一点,并且使用消息可以使viewmodels彼此分离。viewmodels不关心消息来自何处。当他们收到注册的消息时,他们只是做他们被要求做的事情。