Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        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>();
                }
            }
        }
Beispiel #3
0
        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();
            }
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #7
0
        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);
            }
        }
Beispiel #8
0
        /// <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);
            }
        }
Beispiel #9
0
 public AppStartService(
     ViewModelContainer viewModelContainer,
     IViewModelMappingService viewModelMappingService,
     IMaterialDesignInitializationService materialDesignInitializationService)
 {
     _viewModelContainer                  = viewModelContainer;
     _viewModelMappingService             = viewModelMappingService;
     _materialDesignInitializationService = materialDesignInitializationService;
 }
Beispiel #10
0
        public MainWindow()
        {
            string source = Properties.Settings.Default.DAOFilename;

            BLC.BLC            blc = new BLC.BLC(source);
            ViewModelContainer vmc = new ViewModelContainer(blc);

            InitializeComponent();
            DataContext = vmc;
        }
Beispiel #11
0
        public void DataBindingConnect(ViewModelContainer rViewModelContainer)
        {
            // 把Event绑定到ViewController里面
            this.BindingEvents(rViewModelContainer);

            // ViewModel和View之间的数据绑定
            this.BindingViewAndViewModels(rViewModelContainer);

            // ListViewModel和View之间的数据绑定
            this.BindingListViewAndViewModels(rViewModelContainer);
        }
Beispiel #12
0
 /// <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);
         }
     }
 }
Beispiel #13
0
        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;
            }
        }
Beispiel #15
0
        /// <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());
                }
            }
        }
Beispiel #16
0
        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;
        }
Beispiel #18
0
        /// <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);
        }
Beispiel #20
0
        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;
            }
        }
Beispiel #23
0
        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);
        }
Beispiel #24
0
        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);
        }
Beispiel #25
0
        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);
        }
Beispiel #26
0
 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));
                }
            }
        }
Beispiel #30
0
 public MainWindow()
 {
     InitializeComponent();
     DataContext = new ViewModelContainer();
 }
 public HostingNAdapter(ViewModelContainer container) : base(container)
 {
 }
Beispiel #32
0
 public ViewContainer(ViewModelContainer viewModelContainer)
 {
     DataContext = viewModelContainer;
     InitializeComponent();
 }