private ViewModelNavigationItem CreateNavigationItem(ViewModelInfo root)
        {
            var nav = new ViewModelNavigationItem(root);

            nav.OnNavigate += (sender, args) => SetAsCurrentVM(args.ViewModelInfo);
            return(nav);
        }
        /// <summary>
        /// Set the targeted ViewModel
        /// </summary>
        public void SetViewModel(ViewModelInfo vm)
        {
            var type = vm.ViewModel.GetType();

            Properties.Clear();
            foreach (var prop in type.GetProperties().OrderBy(e => e.Name))
            {
                IViewModelProperty property = null;
                if (prop.PropertyType == typeof(string))
                {
                    property = new StringViewModelProperty(vm.ViewModel, prop);
                }
                else if (prop.PropertyType == typeof(bool))
                {
                    property = new BoolViewModelProperty(vm.ViewModel, prop);
                }
                else if (prop.PropertyType == typeof(ICommand) || prop.PropertyType.GetInterfaces().Any(e => e == typeof(ICommand)))
                {
                    property = new CommandViewModelProperty(vm.ViewModel, prop);
                }

                if (property == null)
                {
                    property = new ObjectViewModelProperty(vm.ViewModel, prop);
                }
                property.ReadValue();
                Properties.Add(property);
            }
        }
示例#3
0
        /// <summary>
        /// Register View and ViewModel without MessageRegister
        /// </summary>
        /// <typeparam name="TView">View's type</typeparam>
        /// <typeparam name="TViewModel">ViewModel's type</typeparam>
        /// <param name="token">ViewModel's token</param>
        public static void Register <TView, TViewModel>(string token = "")
        {
            var vmInfo = new ViewModelInfo(
                typeof(TView),
                typeof(TViewModel),
                token: token);

            _viewModelInfoList.Add(vmInfo);
        }
示例#4
0
        private ViewModelInfo GetViewModelInfo(string route, string pageText)
        {
            route = string.IsNullOrEmpty(route)
                ? ""
                : route.Substring(0, 1).ToUpper() + route.Substring(1);
            var info = new ViewModelInfo(route.ToLower(), route + "Vm");

            var match = ExtractElement.Match(pageText);

            if (match.Success)
            {
                info.ElementName = NamingConverter.SnakeToPascalCase(route);
                if (!string.IsNullOrEmpty(match.Groups[2].Value))
                {
                    info.Bindings = match.Groups[2].Value
                                    .Split(',')
                                    .Select(b => b.Trim())
                                    .ToList();
                }
                info.VmName    = null;
                info.SortIndex = 0;
            }
            else
            {
                match = ExtractName.Match(pageText);
                if (match.Success)
                {
                    info.VmName = match.Groups[1].Value;
                }
                match = ExtractTitle.Match(pageText);
                if (match.Success)
                {
                    info.Title     = match.Groups[1].Value;
                    info.SortIndex = (string.IsNullOrEmpty(match.Groups[3].Value))
                        ? 0
                        : int.Parse(match.Groups[3].Value);
                }
                else
                {
                    info.Title = route;
                }
            }
            info.Visible   = info.SortIndex > 0;
            info.SortIndex = Math.Abs(info.SortIndex);

            if (!string.IsNullOrEmpty(info.VmName))
            {
                _viewModels.Add(info);
            }
            return(info);
        }
 public virtual void Raise <TViewModel>(string viewName, ViewModelInfo context, Action <TViewModel> onAvailable)
     where TViewModel : class
 {
     Raised?.Invoke(this, new ViewInteractionRequestEventArgs(
                        viewName, context,
                        view =>
     {
         if (onAvailable != null)
         {
             var viewModel = ViewModelContainerHelper.GetViewModelAs <TViewModel>(view);
             onAvailable.Invoke(viewModel);
         }
     })
                    );
 }
        private void SetAsCurrentVM(ViewModelInfo arg)
        {
            ViewModels.Clear();
            NavigationStack.Clear();

            CurrentViewModel = arg;
            ViewModels.Fill(arg.ChildViewModels.Select(CreateNavigationItem));

            var item = arg;

            while (item != null)
            {
                NavigationStack.Insert(0, CreateNavigationItem(item));
                item = item.ParentViewModel;
            }
            _mainpulator.SetViewModel(arg);
        }
 public void Raise(string viewName, ViewModelInfo context)
 {
     Raised?.Invoke(this, new ViewInteractionRequestEventArgs(viewName, context, null));
 }
 public void Raise <TViewModel>(ViewModelInfo modelInfo, Action <TViewModel> availableCallback) where TViewModel : class
 {
     Raise(null, modelInfo, availableCallback);
 }
 public virtual void Raise(ViewModelInfo modelInfo)
 {
     Raise(null, modelInfo);
 }
示例#10
0
 /// <inheritdoc />
 public ViewModelNavigationItem(ViewModelInfo viewModelInfo)
 {
     ViewModelInfo = viewModelInfo;
     Name          = viewModelInfo.ViewModel.__Name;
 }
 public ViewInteractionRequestEventArgs(string viewName, ViewModelInfo info, Action <object> availableCallback)
 {
     ViewName          = viewName;
     Info              = info;
     AvailableCallback = availableCallback;
 }