/// <summary> /// 初始化ViewController /// </summary> private async Task InitializeViewModel() { this.ViewModelContainer = this.GameObject.GetComponent <ViewModelContainer>(); if (this.ViewModelContainer == null) { Debug.LogErrorFormat("Prefab {0} has not ViewContainer Component..", this.ViewName); return; } var rType = Type.GetType(this.ViewModelContainer.ViewModelClass); 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); }
protected override async void OnResume() { Console.WriteLine("Resuming"); await Task.Delay(1000); ViewModelContainer container = ((AppShell)MainPage).Container; IGameService gameService = container.GetService <IGameService>(); if (!gameService.Client.Connected) { await container.NavigationService.NavigateToRoot(); } else if (container.NavigationService.CurrentViewModel is not LandingViewModel and not GameViewModel) { if (gameService.IsLoggedIn) { await container.NavigationService.NavigateTo <LandingViewModel>(animate : false); await container.NavigationService.NavigateTo <GameViewModel>(); } else { await container.NavigationService.NavigateTo <LandingViewModel>(); } } }
public void DataBindingDisconnect(ViewModelContainer rViewModelContainer) { if (!rViewModelContainer) { return; } var rAllMemberBindings = rViewModelContainer.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 = rViewModelContainer.gameObject.GetComponentsInChildren <EventBinding>(true); for (int i = 0; i < rAllEventBindings.Length; i++) { rAllEventBindings[i].OnDestroy(); } }
public object ViewModel(Func <object> constructor) { if (DesignMode) { return(constructor()); } string caller = new StackFrame(1).GetMethod().Name; if (!caller.StartsWith("get_")) { throw new ArgumentException("Only call ViewModel from a property getter."); } string propertyName = caller.Substring(4); ForView.Initialize(); ViewModelContainer container; if (!_containerByName.TryGetValue(propertyName, out container)) { container = new ViewModelContainer(() => FirePropertyChanged(propertyName), constructor); _containerByName.Add(propertyName, container); } return(container.ViewModel); }
public static bool Navigate <T>(this Page page, string address, UriKind uriKind, T model) where T : ViewModel { var guid = ViewModelContainer.Push(model); var pageAddress = string.Format("{0}?modelId={1}", address, guid); return(page.NavigationService.Navigate(new Uri(pageAddress, uriKind))); }
/// <Docs>Bundle in which to place your saved state.</Docs> /// <summary> /// Raises the save instance state event and puts the ViewModel back into the container. /// </summary> /// <param name="outState">Out state.</param> protected override void OnSaveInstanceState(Android.OS.Bundle outState) { var guid = ViewModelContainer.Push(this.Model); outState.PutString(ModelId, guid.ToString()); base.OnSaveInstanceState(outState); }
private void BindingTabViewAndViewModels(ViewModelContainer rViewModelContainer) { var rViewModelDataSources = rViewModelContainer.gameObject.GetComponentsInChildren <ViewModelDataSourceTab>(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.FillTabItems(rViewModelDataSource); }); rViewModel.PropChangedHandler += rViewModelDataSource.ViewModelPropertyWatcher.PropertyChanged; this.FillTabItems(rViewModelDataSource); } }
/// <summary> /// ListViewModel和View之间的数据绑定 /// </summary> private void BindingListViewAndViewModels(ViewModelContainer rViewModelContainer) { var rViewModelDataSources = UtilTool.GetComponentsInChildrenUtilOrigin <ViewModelDataSourceList>(rViewModelContainer); 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); } }
public AppStartService( ViewModelContainer viewModelContainer, IViewModelMappingService viewModelMappingService, IMaterialDesignInitializationService materialDesignInitializationService) { _viewModelContainer = viewModelContainer; _viewModelMappingService = viewModelMappingService; _materialDesignInitializationService = materialDesignInitializationService; }
public MainWindow() { string source = Properties.Settings.Default.DAOFilename; BLC.BLC blc = new BLC.BLC(source); ViewModelContainer vmc = new ViewModelContainer(blc); InitializeComponent(); DataContext = vmc; }
public void DataBindingConnect(ViewModelContainer rViewModelContainer) { // 把Event绑定到ViewController里面 this.BindingEvents(rViewModelContainer); // ViewModel和View之间的数据绑定 this.BindingViewAndViewModels(rViewModelContainer); // ListViewModel和View之间的数据绑定 this.BindingListViewAndViewModels(rViewModelContainer); }
/// <summary> /// 把Event绑定到ViewController里面 /// </summary> private void BindingEvents(ViewModelContainer rViewModelContainer) { for (int i = 0; i < rViewModelContainer.EventBindings.Count; i++) { var rEventBinding = rViewModelContainer.EventBindings[i]; var bResult = HotfixDataBindingTypeResolve.MakeViewModelDataBindingEvent(this, rEventBinding); if (!bResult) { Debug.LogErrorFormat("Make view model binding event {0} failed..", rEventBinding.ViewModelMethod); } } }
public static T GetViewModel <T>(this Page page) where T : ViewModel { Guid guid; if (page.NavigationContext.QueryString.ContainsKey("modelId") && Guid.TryParse(page.NavigationContext.QueryString["modelId"], out guid)) { return(ViewModelContainer.Pull(guid) as T); } return(null); }
/// <summary> /// Raises the create event and pulls the ViewModel from the container. /// </summary> /// <param name="savedInstanceState">Saved instance state.</param> protected override void OnCreate(Android.OS.Bundle savedInstanceState) { base.OnCreate(savedInstanceState); this.Model = ViewModelContainer.Pull((savedInstanceState ?? this.Intent.Extras).GetString(ModelId)) as T; var activityModel = this.Model as NavigatorViewModel; if (activityModel != null) { activityModel.Presenter = this; } }
/// <summary> /// 把ViewModel绑定到ViewController里面 /// </summary> public void BindingViewModels(ViewModelContainer rViewModelContainer) { for (int i = 0; i < rViewModelContainer.ViewModels.Count; i++) { var rViewModelDataSource = rViewModelContainer.ViewModels[i]; ViewModel rViewModel = null; Type rViewModelType = Type.GetType(rViewModelDataSource.ViewModelPath); if (rViewModelType != null) { rViewModel = HotfixReflectAssists.Construct(rViewModelType) as ViewModel; } if (rViewModel != null) { this.AddViewModel(rViewModelDataSource.Key, rViewModel); } else { Debug.LogErrorFormat("Can not find ViewModel {0}.", rViewModelDataSource.ViewModelPath); } } // 指定ViewModel给子类的变量 通过HotfixBinding属性标签绑定 foreach (var rPair in this.ViewModels) { ViewModel rViewModel = rPair.Value; var rViewModelProp = this.GetType().GetFields(HotfixReflectAssists.flags_public) .Where(prop => { var rAttrObjs = prop.GetCustomAttributes(typeof(HotfixBindingAttribute), false); if (rAttrObjs == null || rAttrObjs.Length == 0) { return(false); } var rBindingAttr = rAttrObjs[0] as HotfixBindingAttribute; return(prop.FieldType.IsSubclassOf(typeof(ViewModel)) && rBindingAttr != null && rBindingAttr.Name.Equals(rPair.Key)); }).FirstOrDefault(); if (rViewModelProp != null) { rViewModelProp.SetValue(this, rViewModel); } else { Debug.LogErrorFormat("ViewModel {0} is not define in ViewController({1})", rViewModel.GetType(), this.GetType()); } } }
public AppShell() { Container = new ViewModelContainer(); Container.RegisterService <IGameService, GameService>(); Container.RegisterService <IDialogService, DialogService>(); GameService = Container.GetService <IGameService>(); GameService.LoggedIn += GameService_LoggedIn; GameService.Client.UserDataUpdated += Client_UserDataUpdated; InitializeComponent(); }
public object ViewModel(Func<object> constructor, [CallerMemberName] string propertyName = "") { if (DesignMode) return constructor(); ForView.Initialize(); ViewModelContainer container; if (!_containerByName.TryGetValue(propertyName, out container)) { container = new ViewModelContainer(() => FirePropertyChanged(propertyName), constructor); _containerByName.Add(propertyName, container); } return container.ViewModel; }
/// <summary> /// ViewModel和View之间的数据绑定 /// </summary> private void BindingViewAndViewModels(ViewModelContainer rViewModelContainer) { var rAllMemberBindings = UtilTool.GetComponentsInChildrenUtilOrigin <MemberBindingAbstract>(rViewModelContainer); 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; } 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(); } } }
public static bool StartActivity <T, TModel>(this Context context, TModel model) where TModel : ViewModel where T : ViewModelActivity <TModel> { var guid = ViewModelContainer.Push(model); var intent = new Intent(context, typeof(T)); intent.PutExtra("modelId", guid.ToString()); if (!(context is Activity)) { intent.AddFlags(ActivityFlags.NewTask); } context.StartActivity(intent); return(true); }
public object ViewModel(Func <object> constructor, [CallerMemberName] string propertyName = "") { if (DesignMode) { return(constructor()); } ForView.Initialize(); ViewModelContainer container; if (!_containerByName.TryGetValue(propertyName, out container)) { container = new ViewModelContainer(() => FirePropertyChanged(propertyName), constructor); _containerByName.Add(propertyName, container); } return(container.ViewModel); }
public object ViewModel(Func<object> constructor) { if (DesignMode) return constructor(); string caller = new StackFrame(1).GetMethod().Name; if (!caller.StartsWith("get_")) throw new ArgumentException("Only call ViewModel from a property getter."); string propertyName = caller.Substring(4); ForView.Initialize(); ViewModelContainer container; if (!_containerByName.TryGetValue(propertyName, out container)) { container = new ViewModelContainer(() => FirePropertyChanged(propertyName), constructor); _containerByName.Add(propertyName, container); } return container.ViewModel; }
public App(bool sync = false) { Action init = () => { InitializeComponent(); ViewModelContainer.Init(); page = new MainPage(); }; if (!sync) { task = Task.Run(init); } else { init(); MainPage = page; } }
public void DataBindingConnect(ViewModelContainer rViewModelContainer) { if (rViewModelContainer == null) { return; } // 把Event绑定到ViewController里面 this.BindingEvents(rViewModelContainer); // ViewModel和View之间的数据绑定 this.BindingViewAndViewModels(rViewModelContainer); // ListViewModel和View之间的数据绑定 this.BindingListViewAndViewModels(rViewModelContainer); // TabViewModel和View之间的数据绑定 this.BindingTabViewAndViewModels(rViewModelContainer); }
public MainPageViewModel() { _cacheProvider = ViewModelContainer.GetContainer().Resolve <ICacheProvider>(); _navigateProvider = ViewModelContainer.GetContainer().Resolve <INavigateProvider>(); _openProvider = ViewModelContainer.GetContainer().Resolve <IOpenProvider>(); _historyProvider = ViewModelContainer.GetContainer().Resolve <IHistoryProvider>(); _logger = ViewModelContainer.GetContainer().Resolve <ILoger>(); OpenFileCommand = new RelayCommand(OpenFile); NavigateFileCommand = new RelayCommand(NavigateFile); GoRightCommand = new RelayCommand(GoRight); GoLeftCommand = new RelayCommand(GoLeft); }
public override bool NavigateTo <T>(object sender, T model) { if (base.NavigateTo <T> (sender, model)) { return(true); } Intent intent; if (TryGetIntent(model, sender, out intent)) { var guid = ViewModelContainer.Push(model); intent.PutExtra("modelId", guid.ToString()); sender.StartActivity(intent); return(true); } return(false); }
public NavigationAdapter(ViewModelContainer container) { this.container = container; }
public static T GetViewModel <T>(this Activity activity) where T : ViewModel { return(ViewModelContainer.Pull(activity.Intent.Extras.GetString("modelId")) as T); }
protected override void OnEnable() { base.OnEnable(); mTarget = this.target as ViewModelContainer; }
protected void AssignCrossViewWrappersToVm() { // Reference for ViewModel saved for optimization // (otherwise it will be searched somwhere in service's dictionary). var vm = ViewModel; if (vm == null) { throw new CrossViewInjectorException(string.Format(NullExceptionMessage, nameof(ViewModel))); } if (ViewModelContainer == null) { throw new CrossViewInjectorException(string.Format(NullExceptionMessage, nameof(ViewModelContainer))); } var viewControllerProperties = FindCrossViewAttributedValues(ViewModelContainer?.GetType()); var viewModelProperties = FindCrossViewAttributedValues(ViewModel?.GetType()); foreach (var controllerProp in viewControllerProperties.Where(controllerProp => !viewModelProperties.ContainsKey(controllerProp.Key))) { ExceptionLogger.RaiseNonFatalException(new Exception( $"{controllerProp.Key} cross view property declared in [{ViewModelContainer.GetType().Name}] was not found in [{vm.GetType().Name}]")); } foreach (var vmProp in viewModelProperties.Where( vmProp => !viewControllerProperties.ContainsKey(vmProp.Key))) { ExceptionLogger.RaiseNonFatalException(new Exception( $"{vmProp.Key} cross view property declared in [{vm.GetType().Name}] was not found in [{ViewModelContainer.GetType().Name}]")); } foreach (var item in viewModelProperties) { if (!viewControllerProperties.TryGetValue(item.Key, out var propertyWithValueToSet)) { continue; } if (item.Value.CanWrite) { try { if (propertyWithValueToSet.CanRead) { item.Value.SetValue(ViewModel, GetWrapperForView(propertyWithValueToSet?.GetValue(ViewModelContainer))); } else { ExceptionLogger.RaiseNonFatalException( new CrossViewInjectorException(GetterIsForbidden)); } } catch (Exception ex) { Debug.WriteLine(ex.Message); } } else { ExceptionLogger.RaiseNonFatalException( new CrossViewInjectorException(SetterIsForbidden)); } } }
public MainWindow() { InitializeComponent(); DataContext = new ViewModelContainer(); }
public HostingNAdapter(ViewModelContainer container) : base(container) { }
public ViewContainer(ViewModelContainer viewModelContainer) { DataContext = viewModelContainer; InitializeComponent(); }