/// <summary> /// Creates the page. /// </summary> /// <param name="rootModel">The root model.</param> /// <param name="context">The context.</param> /// <param name="settings">The optional popup settings.</param> /// <returns>The page.</returns> public virtual async Task <Page> CreatePageAsync(object rootModel, object context, IDictionary <string, object> settings) { var view = EnsurePage(rootModel, ViewLocator.LocateForModel(rootModel, null, context)); ViewModelBinder.Bind(rootModel, view, context); var haveDisplayName = rootModel as IHaveDisplayName; if (string.IsNullOrEmpty(view.Title) && haveDisplayName != null && !ConventionManager.HasBinding(view, Page.TitleProperty)) { var binding = new Binding("DisplayName") { Mode = BindingMode.TwoWay }; view.SetBinding(Page.TitleProperty, binding); } ApplySettings(view, settings); if (rootModel is IActivate activator) { await activator.ActivateAsync(); } if (rootModel is IDeactivate deactivatable) { view.Unloaded += async(s, e) => await deactivatable.DeactivateAsync(true); } return(view); }
/// <summary> /// Creates a window. /// </summary> /// <param name="rootModel">The view model.</param> /// <param name="isDialog">Whethor or not the window is being shown as a dialog.</param> /// <param name="context">The view context.</param> /// <param name="settings">The optional popup settings.</param> /// <returns>The window.</returns> protected virtual async Task <Window> CreateWindowAsync(object rootModel, bool isDialog, object context, IDictionary <string, object> settings) { var view = EnsureWindow(rootModel, ViewLocator.LocateForModel(rootModel, null, context), isDialog); ViewModelBinder.Bind(rootModel, view, context); var haveDisplayName = rootModel as IHaveDisplayName; if (string.IsNullOrEmpty(view.Title) && haveDisplayName != null && !ConventionManager.HasBinding(view, Window.TitleProperty)) { var binding = new Binding("DisplayName") { Mode = BindingMode.TwoWay }; view.SetBinding(Window.TitleProperty, binding); } ApplySettings(view, settings); var conductor = new WindowConductor(rootModel, view); await conductor.InitialiseAsync(); return(view); }
/// <summary> /// Creates a binding on a <see cref="Parameter"/>. /// </summary> /// <param name="target">The target to which the message is applied.</param> /// <param name="parameter">The parameter object.</param> /// <param name="elementName">The name of the element to bind to.</param> /// <param name="path">The path of the element to bind to.</param> /// <param name="bindingMode">The binding mode to use.</param> public static void BindParameter(FrameworkElement target, Parameter parameter, string elementName, string path, BindingMode bindingMode) { #if XFORMS var element = elementName == "$this" ? target : null; if (element == null) { return; } if (string.IsNullOrEmpty(path)) { path = ConventionManager.GetElementConvention(element.GetType()).ParameterProperty; } var binding = new Binding(path) { Source = element, Mode = bindingMode }; parameter.SetBinding(Parameter.ValueProperty, binding); #else var element = elementName == "$this" ? target : BindingScope.GetNamedElements(target).FindName(elementName); if (element == null) { return; } if (string.IsNullOrEmpty(path)) { path = ConventionManager.GetElementConvention(element.GetType()).ParameterProperty; } #if WINDOWS_UWP var binding = new Binding { Path = new PropertyPath(path), Source = element, Mode = bindingMode }; #else var binding = new Binding(path) { Source = element, Mode = bindingMode }; #endif #if !WINDOWS_UWP binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; #endif BindingOperations.SetBinding(parameter, Parameter.ValueProperty, binding); #endif }
/// <summary> /// Allow Xamarin to navigate to a ViewModel backed by a view which is of type <see cref="T:Xamarin.Forms.ContentView"/> by adapting the result /// to a <see cref="T:Xamarin.Forms.ContentPage"/>. /// </summary> /// <param name="view">The view to be adapted</param> /// <param name="viewModel">The view model which is bound to the view</param> /// <returns>The adapted ContentPage</returns> protected virtual ContentPage CreateContentPage(ContentView view, object viewModel) { var page = new ContentPage { Content = view }; var hasDiplayName = viewModel as IHaveDisplayName; if (hasDiplayName != null) { var path = "DisplayName"; var property = typeof(IHaveDisplayName).GetRuntimeProperty(path); ConventionManager.SetBinding(viewModel.GetType(), path, property, page, null, Page.TitleProperty); page.BindingContext = viewModel; } return(page); }
///<summary> /// Checks if the <see cref="ActionMessage" /> -Target was set. ///</summary> ///<param name="element"> DependencyObject to check </param> ///<returns> True if Target or TargetWithoutContext was set on <paramref name="element" /> </returns> public static bool HasTargetSet(DependencyObject element) { if (GetTarget(element) != null || GetTargetWithoutContext(element) != null) { return(true); } #if XFORMS return(false); #else var frameworkElement = element as FrameworkElement; if (frameworkElement == null) { return(false); } return(ConventionManager.HasBinding(frameworkElement, TargetProperty) || ConventionManager.HasBinding(frameworkElement, TargetWithoutContextProperty)); #endif }