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

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

ICommand addUser;
        public ICommand AddUser
        {
            get
            {
                if(addUser ==null)
                addUser = new Microsoft.Practices.Prism.Commands.DelegateCommand(OnAddingUser);
                return addUser;
            }
        }
        void OnAddingUser()
        {
            var viewmodel = ServiceLocator.Current.GetInstance<IViewModel>("EditUserViewModel");
            this.CurrentUser = this.userService.AddUser();
            this.eventAggregator.GetEvent<CommandEvent>().Publish(new CommandEventPara() { CommandName = "EditUser", Entity = this.CurrentUser });
        }

        void OnEditUserComplete(CommandEventPara para)
        {
            this.userService.SaveChangesAsync();
        }

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

[ImportingConstructor]
        public EditUserViewModel(IEventAggregator _eventAggregator, IRegionManager _regionManager)
        {
            eventAggregator = _eventAggregator;
            regionManager = _regionManager;
            this.eventAggregator.GetEvent<CommandEvent>().Subscribe(Onloading, ThreadOption.UIThread, true, p => p.CommandName == "EditUser");
            userService = ServiceLocator.Current.GetInstance<IService>("UserService") as UserService;
            groupService = ServiceLocator.Current.GetInstance<IService>("GroupService") as GroupService; ;
            groupService.GetGroupListComplete += new EventHandler<EntityResultsArgs<T_SYS_GROUP>>(groupService_GetGroupListComplete);
            groupService.GetGroupListAsync();
            
        }

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

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

void Onloading(CommandEventPara para)
        {
            if (para.Entity != null)
            {
                this.CurrentUser = para.Entity as T_SYS_USER;
                this.Userid = (para.Entity as T_SYS_USER).SACCOUNTID;
                this.AccountCode = (para.Entity as T_SYS_USER).SACCOUNTCODE;
                this.CompanyCode = (para.Entity as T_SYS_USER).SCOMPANYCODE;
                this.UserName = (para.Entity as T_SYS_USER).SUSERNAME;
                this.Mobile = (para.Entity as T_SYS_USER).SMOBILE;
                this.Phone = (para.Entity as T_SYS_USER).SPHONE;
                ChildWindow view = ServiceLocator.Current.GetInstance<IView>("AddUserView") as ChildWindow;
                
                view.Show();
            }
        }

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

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

 private string _companyCode;
        [Required(ErrorMessage = "单位必选")]
        public string CompanyCode
        {
            get { return _companyCode; }
            set
            {
                _companyCode = value;
                RaisePropertyChanged("CompanyCode");
            }
        }

void groupService_GetGroupListComplete(object sender, EntityResultsArgs<T_SYS_GROUP> e)
        {
            
            if (!e.HasError)
            {
                this.GroupList = new ObservableCollection<T_SYS_GROUP>(e.Results);
                RaisePropertyChanged("CompanyCode");
                
            }
        }




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值