在使用MEF+MVVM模式中要学会活用RaisePropertyChanged属性更改通知

在MEF模式下,通常是viewmodel发布一个事件,另一个viewmodel接收并处理事件,事件处理通常会加载View。如下代码:

[html]  view plain  copy
  1. ICommand addUser;  
  2.         public ICommand AddUser  
  3.         {  
  4.             get  
  5.             {  
  6.                 if(addUser ==null)  
  7.                 addUser = new Microsoft.Practices.Prism.Commands.DelegateCommand(OnAddingUser);  
  8.                 return addUser;  
  9.             }  
  10.         }  
  11.         void OnAddingUser()  
  12.         {  
  13.             var viewmodel = ServiceLocator.Current.GetInstance<IViewModel>("EditUserViewModel");  
  14.             this.CurrentUser = this.userService.AddUser();  
  15.             this.eventAggregator.GetEvent<CommandEvent>().Publish(new CommandEventPara() { CommandName = "EditUser"Entity = this.CurrentUser });  
  16.         }  
  17.   
  18.         void OnEditUserComplete(CommandEventPara para)  
  19.         {  
  20.             this.userService.SaveChangesAsync();  
  21.         }  

AddUser事件处理程序OnAddingUser,首先实例化一个EditUserVIewmodel,在EditUserViewModel中加入事件接收处理程序,然后在发布事件,这样EditUserVIewmodel就能够响应事件,进行事件 处理。再看看EditUserVIewmodel初始化过程

[html]  view plain  copy
  1. [ImportingConstructor]  
  2.         public EditUserViewModel(IEventAggregator _eventAggregator, IRegionManager _regionManager)  
  3.         {  
  4.             eventAggregator = _eventAggregator;  
  5.             regionManager = _regionManager;  
  6.             this.eventAggregator.GetEvent<CommandEvent>().Subscribe(Onloading, ThreadOption.UIThread, true, p => p.CommandName == "EditUser");  
  7.             userService = ServiceLocator.Current.GetInstance<IService>("UserService") as UserService;  
  8.             groupService = ServiceLocator.Current.GetInstance<IService>("GroupService") as GroupService; ;  
  9.             groupService.GetGroupListComplete += new EventHandler<EntityResultsArgs<T_SYS_GROUP>>(groupService_GetGroupListComplete);  
  10.             groupService.GetGroupListAsync();  
  11.               
  12.         }  

这里使用的是MEF构造注入,构造函数中进一步实例化一些服务类用来获取Model或列表数据,由于silverlight是异步模式,这样会导致事件响应后部分数据还未获取成功,比如此例中groupservice要获取的grouplist,这样必然导致界面显示出来后还有部分组件数据未能有效加载。下面是响应事件 处理程序,并弹出窗口,此方法将优先在

groupService_GetGroupListComplete方法执行。这样导致ChildWindow中的Combobox数据无法正确绑定。

[html]  view plain  copy
  1. void Onloading(CommandEventPara para)  
  2.         {  
  3.             if (para.Entity != null)  
  4.             {  
  5.                 this.CurrentUser = para.Entity as T_SYS_USER;  
  6.                 this.Userid = (para.Entity as T_SYS_USER).SACCOUNTID;  
  7.                 this.AccountCode = (para.Entity as T_SYS_USER).SACCOUNTCODE;  
  8.                 this.CompanyCode = (para.Entity as T_SYS_USER).SCOMPANYCODE;  
  9.                 this.UserName = (para.Entity as T_SYS_USER).SUSERNAME;  
  10.                 this.Mobile = (para.Entity as T_SYS_USER).SMOBILE;  
  11.                 this.Phone = (para.Entity as T_SYS_USER).SPHONE;  
  12.                 ChildWindow view = ServiceLocator.Current.GetInstance<IView>("AddUserView") as ChildWindow;  
  13.                   
  14.                 view.Show();  
  15.             }  
  16.         }  

处理办法:由于Combobox的selectvalue绑定的是CompanyCode属性,所以我们需要在

groupService_GetGroupListComplete函数中加入一个引发CompanyCode属性变化的事件,该事件会触发UI进行数据更新,这样就能够解决数据正确加载绑定了。

[html]  view plain  copy
  1. private string _companyCode;  
  2.        [Required(ErrorMessage = "单位必选")]  
  3.        public string CompanyCode  
  4.        {  
  5.            get { return _companyCode; }  
  6.            set  
  7.            {  
  8.                _companyCode = value;  
  9.                RaisePropertyChanged("CompanyCode");  
  10.            }  
  11.        }  

[html]  view plain  copy
  1. void groupService_GetGroupListComplete(object sender, EntityResultsArgs<T_SYS_GROUP> e)  
  2.         {  
  3.               
  4.             if (!e.HasError)  
  5.             {  
  6.                 this.GroupList = new ObservableCollection<T_SYS_GROUP>(e.Results);  
  7.                 RaisePropertyChanged("CompanyCode");  
  8.                   
  9.             }  
  10.         }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值