【问题标题】:how to refresh ObservableCollection in View1 when coming back from view2 in wp8 mvvm project从 wp8 mvvm 项目中的 view2 返回时如何刷新 View1 中的 ObservableCollection
【发布时间】:2014-01-02 16:46:45
【问题描述】:

我有一个 MVVM 项目,其中主视图(“View1”)有一个名为“保存”的按钮和具有模型 emp 绑定的列表框控件。

视图模型 (ViewModel1) 实现了 inotifypropertychanged,它具有 SavedButtonCommand 绑定到 View1 的保存按钮并将记录保存到 SavedEMp。在 View1 中有一个按钮“下一步”,它进入“View2”页面。View2 页面有 ViewModel2,它有 SaveAgain 按钮。并且 viewmodel2 绑定到 SaveAgainButtonCommand 并且它还将记录保存到名为 SavedEmp 的 emp 记录的 localdb 中。

当语句 RaisePropertyChanged("SavedEmpDataSoruce") 被执行并且 observablecollection "SavedEmpDataSoruce" 绑定到这个列表框时,View1 列表框被刷新。因为这两个在 View1 中保存按钮之后,每当语句 RaisePropertyChanged("SavedEmpDataSoruce") 获取执行它正在刷新数据。

但是当用户从 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");
        }
    }

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

【问题讨论】:

    标签: c# windows-phone-7 mvvm windows-phone-8 windows-phone


    【解决方案1】:

    依赖视图之间的通信可以使用 Messenger 样式的对象来完成。如果您正在使用该对象的实现,则它是 MVVM Light 工具包的标准配置。该模式由一个对象向信使注册以在提供的回调中接收给定类型的消息,以及另一个对象分派该类型的消息。信使维护这些消息的收件人列表,并相应地将它们作为参数传递给收件人提供的回调函数。使用 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));
        }
    }
    

    从某种意义上说,这类似于引发事件并为这些事件注册侦听器,但该模型非常强大且更加断开连接,因此请尽可能少用它,因为这确实会给程序员带来维护问题跟在你身后并尝试跟随控制流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      相关资源
      最近更新 更多