C# 如何在wp8 mvvm项目中从view2返回时刷新View1中的ObservableCollection

C# 如何在wp8 mvvm项目中从view2返回时刷新View1中的ObservableCollection,c#,windows-phone-7,mvvm,windows-phone-8,windows-phone,C#,Windows Phone 7,Mvvm,Windows Phone 8,Windows Phone,我有一个MVVM项目,其中主视图(“View1”)有一个名为Save和listbox控件的按钮,该按钮具有模型emp的绑定 viewmodel(ViewModel1)实现inotifypropertychanged,它具有SavedButtonCommand绑定到View1的Save按钮,并将记录保存到SavedEMp。在View1中,有一个按钮“Next”指向“View2”page.View2页面有ViewModel2,它有SaveReach按钮。ViewModel2有一个到SaveAgain

我有一个MVVM项目,其中主视图(“View1”)有一个名为Save和listbox控件的按钮,该按钮具有模型emp的绑定

viewmodel(ViewModel1)实现inotifypropertychanged,它具有SavedButtonCommand绑定到View1的Save按钮,并将记录保存到SavedEMp。在View1中,有一个按钮“Next”指向“View2”page.View2页面有ViewModel2,它有SaveReach按钮。ViewModel2有一个到SaveAgainButtonCommand的绑定,它还将记录保存到名为SavedEmp of emp records的localdb

当执行语句RaisePropertyChanged(“SavedEmpDataSoruce”)并且observablecollection“SavedEmpDataSoruce”绑定到此列表框时,View1列表框将刷新。因为当语句RaisePropertyChanged(“SavedEmpDataSoruce”)时,这两个列表框在View1中位于save按钮之后在刷新数据时执行

但当用户从View2返回View1时,View1中的列表框不会用View2保存的emp记录的数据刷新

    private ObservableCollection<Emp> _SavedEmp;
    public ObservableCollection<Emp> SavedEmp
    {
        get
        {

            if(_SavedEmp == null)
                {                       
                   _SavedEmp  = Emp.GetSavedEmps();

                }
            return _SavedEmp;                

        }
        set
        {
            this._SavedEmp = value;
            RaisePropertyChanged("SavedEmp");
        }
    }
private observeCollection\u SavedEmp;
公共可观测集合保存DEMP
{
得到
{
如果(_SavedEmp==null)
{                       
_SavedEmp=Emp.GetSavedEmps();
}
返回_SavedEmp;
}
设置
{
该值为.\u SavedEmp=value;
RaisePropertyChanged(“SavedEmp”);
}
}

当再次从View2移动到View1时,是否有办法刷新列表框数据?

可以使用Messenger样式的对象来完成从属视图之间的通信。如果您正在使用MVVM Light toolkit,则该对象的实现是MVVM Light toolkit的标准配置。该模式由一个向messenger注册以在提供的回调中接收给定类型的消息的对象和另一个分派该类型消息的对象组成。信使维护这些消息的收件人列表,并相应地将其作为参数传递给收件人提供的回调函数。使用MVVM Light的messenger的示例实现如下:

// Message container
public class AccountChangedMessage : GalaSoft.MvvmLight.Messaging.GenericMessage<Account>
{
    public AccountChangedMessage(Account a) : base(a) { }
}

// Dependent ViewModel
public class AccountsViewModel : GalaSoft.MvvmLight.ViewModelBase
{
    public AccountsViewModel()
    {
        MessengerInstance.Register<AccountChangedMessage>(this, OnAccountChanged);
    }

    private void OnAccountChanged(AccountChangedMessage msg)
    {
        // TODO: Rebuild bound data
    }
}

// Initiating ViewModel
public class AccountEditViewModel : GalaSoft.MvvmLight.ViewModelBase
{
    public void SaveAccount()
    {
        _accountService.Save(_account);

        MessengerInstance.Send(new AccountChangedMessage(_account));
    }
}
//消息容器
公共类AccountChangedMessage:GalaSoft.MvvmLight.Messaging.GenericMessage
{
公共帐户更改消息(帐户a):基本(a){}
}
//从属视图模型
公共类AccountsViewModel:GalaSoft.MvvmLight.ViewModelBase
{
公共帐户viewmodel()
{
注册(这个,OnAccountChanged);
}
AccountChanged上的私有无效(AccountChangedMessage msg)
{
//TODO:重建绑定数据
}
}
//初始化视图模型
公共类AccountEditViewModel:GalaSoft.MvvmLight.ViewModelBase
{
公共帐户()
{
_accountService.Save(_account);
Send(newaccountchangedmessage(_account));
}
}
从某种意义上说,这类似于引发事件并为这些事件注册侦听器,但该模型非常强大,而且更加不连续,因此请尽量少用它,因为这确实会给那些在您后面并试图遵循控制流的程序员带来维护问题