/// <summary> /// 初始化ViewController /// </summary> private async Task InitializeViewModel() { this.ViewModelContainer = this.GameObject.GetComponent <ViewControllerContainer>(); if (this.ViewModelContainer == null) { Debug.LogErrorFormat("Prefab {0} has not ViewContainer Component..", this.ViewName); return; } var rType = Type.GetType(this.ViewModelContainer.ViewControllerClass); if (rType == null) { Debug.LogErrorFormat("Can not find ViewModel Type: {0}", rType); return; } // 构建ViewController this.ViewController = HotfixReflectAssists.Construct(rType) as ViewController; this.ViewController.View = this; this.ViewController.BindingViewModels(this.ViewModelContainer); await this.ViewController.Initialize(); this.ViewController.DataBindingConnect(this.ViewModelContainer); }
public void DataBindingDisconnect(ViewControllerContainer rViewControllerContainer) { if (!rViewControllerContainer) { return; } var rAllMemberBindings = rViewControllerContainer.gameObject.GetComponentsInChildren <MemberBindingAbstract>(true); for (int i = 0; i < rAllMemberBindings.Length; i++) { var rMemberBinding = rAllMemberBindings[i]; if (rMemberBinding.ViewModelProp == null) { continue; } ViewModel rViewModel = rMemberBinding.ViewModelProp.PropertyOwner as ViewModel; if (rViewModel != null) { rViewModel.PropChangedHandler -= rMemberBinding.ViewModelPropertyWatcher.PropertyChanged; } rMemberBinding.OnDestroy(); } var rAllEventBindings = rViewControllerContainer.gameObject.GetComponentsInChildren <EventBinding>(true); for (int i = 0; i < rAllEventBindings.Length; i++) { rAllEventBindings[i].OnDestroy(); } }
/// <summary> /// ListViewModel和View之间的数据绑定 /// </summary> private void BindingListViewAndViewModels(ViewControllerContainer rViewControllerContainer) { var rViewModelDataSources = UtilTool.GetComponentsInChildrenUtilOrigin <ViewModelDataSourceList>(rViewControllerContainer); for (int i = 0; i < rViewModelDataSources.Count; i++) { var rViewModelDataSource = rViewModelDataSources[i]; rViewModelDataSource.ViewModelProp = HotfixDataBindingTypeResolve.MakeViewModelDataBindingProperty(rViewModelDataSource.ViewModelPath); if (rViewModelDataSource.ViewModelProp == null) { Debug.LogErrorFormat("View Model Path: {0} error..", rViewModelDataSource.ViewModelPath); return; } ViewModel rViewModel = this.GetViewModel(rViewModelDataSource.ViewModelProp.PropertyOwnerKey); if (rViewModel == null) { Debug.LogErrorFormat("View Model: {0} error..", rViewModelDataSource.ViewModelPath); return; } rViewModelDataSource.ViewModelProp.PropertyOwner = rViewModel; // 绑定Watcher rViewModelDataSource.ViewModelPropertyWatcher = new DataBindingPropertyWatcher(rViewModel, rViewModelDataSource.ViewModelProp.PropertyName, () => { // 重新设置List数据时候,改变个数 this.BindingList(rViewModelDataSource); }); rViewModel.PropChangedHandler += rViewModelDataSource.ViewModelPropertyWatcher.PropertyChanged; // 初始化list this.BindingList(rViewModelDataSource); } }
private void BindingArrayViewAndViewModels(ViewControllerContainer rViewModelContainer) { var rViewModelDataSources = rViewModelContainer.gameObject.GetComponentsInChildren <ViewModelDataSourceArray>(true); for (int i = 0; i < rViewModelDataSources.Length; i++) { var rViewModelDataSource = rViewModelDataSources[i]; rViewModelDataSource.ViewModelProp = HotfixDataBindingTypeResolve.MakeViewModelDataBindingProperty(rViewModelDataSource.ViewModelPath); if (rViewModelDataSource.ViewModelProp == null) { Debug.LogErrorFormat("View Model Path: {0} error..", rViewModelDataSource.ViewModelPath); return; } ViewModel rViewModel = this.GetViewModel(rViewModelDataSource.ViewModelProp.PropertyOwnerKey); if (rViewModel == null) { Debug.LogErrorFormat("View Model: {0} error..", rViewModelDataSource.ViewModelPath); return; } rViewModelDataSource.ViewModelProp.PropertyOwner = rViewModel; // 绑定watcher rViewModelDataSource.ViewModelPropertyWatcher = new DataBindingPropertyWatcher(rViewModel, rViewModelDataSource.ViewModelProp.PropertyName, () => { this.FillArrayItems(rViewModelDataSource); }); rViewModel.PropChangedHandler += rViewModelDataSource.ViewModelPropertyWatcher.PropertyChanged; this.FillArrayItems(rViewModelDataSource); } }
/// <summary> /// 把Event绑定到ViewController里面 /// </summary> private void BindingEvents(ViewControllerContainer rViewControllerContainer) { for (int i = 0; i < rViewControllerContainer.EventBindings.Count; i++) { var rEventBinding = rViewControllerContainer.EventBindings[i]; if (rEventBinding.IsListTemplate) { continue; } var bResult = HotfixDataBindingTypeResolve.MakeViewModelDataBindingEvent(this, rEventBinding); if (!bResult) { Debug.LogErrorFormat("Make view model binding event {0} failed..", rEventBinding.ViewModelMethod); } } }
public void DataBindingConnect(ViewControllerContainer rViewControllerContainer) { if (rViewControllerContainer == null) { return; } // 把Event绑定到ViewController里面 this.BindingEvents(rViewControllerContainer); // ViewModel和View之间的数据绑定 this.BindingViewAndViewModels(rViewControllerContainer); // ListViewModel和View之间的数据绑定 this.BindingListViewAndViewModels(rViewControllerContainer); // TabViewModel和View之间的数据绑定 this.BindingTabViewAndViewModels(rViewControllerContainer); // ArrayViewModel和View之间的数据绑定 this.BindingArrayViewAndViewModels(rViewControllerContainer); }
/// <summary> /// 把ViewModel绑定到ViewController里面 /// </summary> public void BindingViewModels(ViewControllerContainer rViewControllerContainer) { for (int i = 0; i < rViewControllerContainer.ViewModels.Count; i++) { var rViewModelDataSource = rViewControllerContainer.ViewModels[i]; ViewModel rViewModel = ViewModelManager.Instance.ReceiveViewModel(rViewModelDataSource.ViewModelPath); // 匹配DefaultViewModel if (this.View.DefaultViewModel != null && this.View.DefaultViewModel.GetType().FullName.Equals(rViewModelDataSource.ViewModelPath)) { rViewModel = this.View.DefaultViewModel; } if (rViewModel != null) { this.AddViewModel(rViewModelDataSource.ViewModelPath, rViewModel); } else { Debug.LogErrorFormat("Can not find ViewModel {0}.", rViewModelDataSource.ViewModelPath); } } }
/// <summary> /// ViewModel和View之间的数据绑定 /// </summary> private void BindingViewAndViewModels(ViewControllerContainer rViewControllerContainer) { var rAllMemberBindings = UtilTool.GetComponentsInChildrenUtilOrigin <MemberBindingAbstract>(rViewControllerContainer); for (int i = 0; i < rAllMemberBindings.Count; i++) { var rMemberBinding = rAllMemberBindings[i]; if (rMemberBinding.IsListTemplate) { continue; // 过滤掉ListTemplate标记得Binding Script } rMemberBinding.ViewProp = DataBindingTypeResolve.MakeViewDataBindingProperty(rMemberBinding.gameObject, rMemberBinding.ViewPath); if (rMemberBinding.ViewProp == null) { Debug.LogErrorFormat("View Path: {0} error..", rMemberBinding.ViewPath); return; } rMemberBinding.ViewModelProp = HotfixDataBindingTypeResolve.MakeViewModelDataBindingProperty(rMemberBinding.ViewModelPath); if (rMemberBinding.ViewModelProp == null) { Debug.LogErrorFormat("View Model Path: {0} error..", rMemberBinding.ViewModelPath); return; } ViewModel rViewModel = this.GetViewModel(rMemberBinding.ViewModelProp.PropertyOwnerKey); if (rViewModel == null) { Debug.LogErrorFormat("View Model: {0} error..", rMemberBinding.ViewModelPath); return; } // 设置类型转换器 if (rMemberBinding.IsDataConvert) { rMemberBinding.ViewModelProp.ConvertMethod = HotfixDataBindingTypeResolve.MakeViewModelDataBindingConvertMethod(rMemberBinding.DataConverterMethodPath); if (rMemberBinding.IsDataConvert && rMemberBinding.ViewModelProp.ConvertMethod == null) { Debug.LogError("Cannot find convert method: {0}.." + rMemberBinding.DataConverterMethodPath); return; } } else { rMemberBinding.ViewModelProp.ConvertMethod = null; } rMemberBinding.ViewModelProp.PropertyOwner = rViewModel; rMemberBinding.SyncFromViewModel(); // ViewModel绑定View rMemberBinding.ViewModelPropertyWatcher = new DataBindingPropertyWatcher(rViewModel, rMemberBinding.ViewModelProp.PropertyName, () => { rMemberBinding.SyncFromViewModel(); }); rViewModel.PropChangedHandler += rMemberBinding.ViewModelPropertyWatcher.PropertyChanged; // View绑定ViewModel var rMemberBindingTwoWay = rMemberBinding as MemberBindingTwoWay; if (rMemberBindingTwoWay != null) { rMemberBindingTwoWay.InitEventWatcher(); } } }
protected override void OnEnable() { base.OnEnable(); mTarget = this.target as ViewControllerContainer; }
public void DataBindingDisconnect(ViewControllerContainer rViewControllerContainer) { if (!rViewControllerContainer) { return; } var rAllMemberBindings = rViewControllerContainer.gameObject.GetComponentsInChildren <MemberBindingAbstract>(true); for (int i = 0; i < rAllMemberBindings.Length; i++) { var rMemberBinding = rAllMemberBindings[i]; if (rMemberBinding.ViewModelProp == null) { continue; } ViewModel rViewModel = rMemberBinding.ViewModelProp.PropertyOwner as ViewModel; if (rViewModel != null) { if (rMemberBinding) { rViewModel.PropChangedHandler -= rMemberBinding.ViewModelPropertyWatcher.PropertyChanged; } } if (rMemberBinding) { rMemberBinding.OnDestroy(); } } var rListViewModelDataSources = UtilTool.GetComponentsInChildrenUtilOrigin <ViewModelDataSourceList>(rViewControllerContainer); for (int i = 0; i < rListViewModelDataSources.Count; i++) { var rViewModelDataSource = rListViewModelDataSources[i]; ViewModel rViewModel = rViewModelDataSource.ViewModelProp.PropertyOwner as ViewModel; if (rViewModel != null) { rViewModel.PropChangedHandler -= rViewModelDataSource.ViewModelPropertyWatcher.PropertyChanged; } } var rTabViewModelDataSources = rViewControllerContainer.gameObject.GetComponentsInChildren <ViewModelDataSourceTab>(true); for (int i = 0; i < rTabViewModelDataSources.Length; i++) { var rViewModelDataSource = rTabViewModelDataSources[i]; ViewModel rViewModel = rViewModelDataSource.ViewModelProp.PropertyOwner as ViewModel; if (rViewModel != null) { rViewModel.PropChangedHandler -= rViewModelDataSource.ViewModelPropertyWatcher.PropertyChanged; } } var rArrayViewModelDataSources = rViewControllerContainer.gameObject.GetComponentsInChildren <ViewModelDataSourceArray>(true); for (int i = 0; i < rArrayViewModelDataSources.Length; i++) { var rViewModelDataSource = rArrayViewModelDataSources[i]; ViewModel rViewModel = rViewModelDataSource.ViewModelProp.PropertyOwner as ViewModel; if (rViewModel != null) { rViewModel.PropChangedHandler -= rViewModelDataSource.ViewModelPropertyWatcher.PropertyChanged; } } var rAllEventBindings = rViewControllerContainer.gameObject.GetComponentsInChildren <EventBinding>(true); for (int i = 0; i < rAllEventBindings.Length; i++) { rAllEventBindings[i].OnDestroy(); } }