Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在另一个ViewModel中完成数据库更改后,如何“刷新”我的ViewModels?_C#_Wpf_Entity Framework_Mvvm - Fatal编程技术网

C# 在另一个ViewModel中完成数据库更改后,如何“刷新”我的ViewModels?

C# 在另一个ViewModel中完成数据库更改后,如何“刷新”我的ViewModels?,c#,wpf,entity-framework,mvvm,C#,Wpf,Entity Framework,Mvvm,我目前正在使用MVVM方法编写一个相当小的桌面应用程序。它还利用实体框架6进行数据库访问。现在,我的顶级ViewModel实例化了“较小”的视图,并将我正在使用的DbContext传递给它们。我使用的较小的ViewModel对应于位于单独选项卡项中的UserControls。但是,如果我在一个选项卡中更改数据库中的某些内容,然后切换该选项卡,那么从逻辑上讲,UI就跟不上,因为没有发生OnPropertyChangedSomeObservableCollection 我想在TabItem激活时刷新

我目前正在使用MVVM方法编写一个相当小的桌面应用程序。它还利用实体框架6进行数据库访问。现在,我的顶级ViewModel实例化了“较小”的视图,并将我正在使用的DbContext传递给它们。我使用的较小的ViewModel对应于位于单独选项卡项中的UserControls。但是,如果我在一个选项卡中更改数据库中的某些内容,然后切换该选项卡,那么从逻辑上讲,UI就跟不上,因为没有发生OnPropertyChangedSomeObservableCollection

我想在TabItem激活时刷新里面的所有内容,但一方面,我不知道该怎么做,这基本上是在PropertyChanged上完成的。。对于每个与UI相关的属性,对吗?另一方面,它看起来既不优雅也不“正确”

我该怎么办?使用一个全局DbContext是否是一种好的做法?我读过关于短期DbContext实例更好的文章,但我也发现关于桌面应用程序的相反说法


您如何处理这种情况?事实上不会那么罕见吧?谢谢

您必须考虑使用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不关心消息来自何处。当他们收到注册的消息时,他们只是做他们被要求做的事情。