예제 #1
0
        /// <summary>
        /// Wraps the specified view.
        /// </summary>
        /// <param name="view">The view.</param>
        /// <param name="viewModelSource">The view model source containing the <c>ViewModel</c> property.</param>
        /// <param name="wrapOptions">The wrap options.</param>
        /// <returns>The <see cref="IViewModelWrapper" />.</returns>
        /// <exception cref="ArgumentNullException">The <paramref name="view" /> is <c>null</c>.</exception>
        public IViewModelWrapper Wrap(IView view, object viewModelSource, WrapOptions wrapOptions)
        {
            Argument.IsNotNull("view", view);
            Argument.IsNotNull("viewModelSource", viewModelSource);

            if (!_wrappers.TryGetValue(view, out var wrapper))
            {
                try
                {
                    // This is "sort of" a lock, we might recursively call this while we are
                    // creating the wrapper, so need to skip *while* we are creating it
                    _wrappers.Add(view, _tempObject);

#if XAMARIN || XAMARIN_FORMS
                    wrapper = new ViewModelWrapper(view);
#else
                    wrapper = CreateViewModelGrid(view, viewModelSource, wrapOptions);
#endif
                }
                finally
                {
                    // Remove the temp object
                    _wrappers.Remove(view);
                }

                if (wrapper != null)
                {
                    _wrappers.Add(view, wrapper);
                }
            }

            return(wrapper);
        }
예제 #2
0
        /// <summary>
        /// Wraps the specified view.
        /// </summary>
        /// <param name="view">The view.</param>
        /// <param name="viewModelSource">The view model source containing the <c>ViewModel</c> property.</param>
        /// <param name="wrapOptions">The wrap options.</param>
        /// <returns>The <see cref="IViewModelWrapper" />.</returns>
        /// <exception cref="ArgumentNullException">The <paramref name="view" /> is <c>null</c>.</exception>
        public IViewModelWrapper Wrap(IView view, object viewModelSource, WrapOptions wrapOptions)
        {
            Argument.IsNotNull("view", view);
            Argument.IsNotNull("viewModelSource", viewModelSource);

#if XAMARIN || XAMARIN_FORMS
            var viewModelWrapper = new ViewModelWrapper(view);
            return(viewModelWrapper);
#else
            return(CreateViewModelGrid(view, viewModelSource, wrapOptions));
#endif
        }
예제 #3
0
        /// <summary>
        /// Wraps the specified view.
        /// </summary>
        /// <param name="view">The view.</param>
        /// <param name="viewModelSource">The view model source containing the <c>ViewModel</c> property.</param>
        /// <param name="wrapOptions">The wrap options.</param>
        /// <returns>The <see cref="IViewModelWrapper" />.</returns>
        /// <exception cref="ArgumentNullException">The <paramref name="view" /> is <c>null</c>.</exception>
        public IViewModelWrapper Wrap(IView view, object viewModelSource, WrapOptions wrapOptions)
        {
            Argument.IsNotNull("view", view);
            Argument.IsNotNull("viewModelSource", viewModelSource);

#if XAMARIN
            var viewModelWrapper = new ViewModelWrapper(view);
            return viewModelWrapper;
#else
            return CreateViewModelGrid(view, viewModelSource, wrapOptions);
#endif
        }
예제 #4
0
        public ViewModelWrapper ConstructViewModel(Type type)
        {
            var instance = Activator.CreateInstance(type);
            var token    = "token_" + _tokenCounter++;

            var viewModelWrapper = new ViewModelWrapper {
                ViewModel = instance, RefToken = token
            };

            _viewModelInstances[token] = viewModelWrapper;

            foreach (var field in type.ObservableFields())
            {
                var localField = field; // Make sure closure doesn't change variable.
                var fieldValue = (IObservable)localField.GetValue(instance);
                fieldValue.Subscribe(newValue => AddPendingChange(localField.Name, newValue, token));
            }

            return(viewModelWrapper);
        }