Search This Blog

Sunday 19 September 2021

Xamarin MVVM ViewModel Locator

ViewModelLocator.cs

public static class ViewModelLocator
{
 
        public static readonly BindableProperty AutoWireViewModelProperty =
            BindableProperty.CreateAttached("AutoWireViewModel", typeof(bool), typeof(ViewModelLocator), default(bool), propertyChanged: OnAutoWireViewModelChanged);
 
        public static bool GetAutoWireViewModel(BindableObject bindable)
        {
            return (bool)bindable.GetValue(ViewModelLocator.AutoWireViewModelProperty);
        }
 
        public static void SetAutoWireViewModel(BindableObject bindable, bool value)
        {
            bindable.SetValue(ViewModelLocator.AutoWireViewModelProperty, value);
        }
 
        private static void OnAutoWireViewModelChanged(BindableObject bindable, object oldValue, object newValue)
        {
            var view = bindable as Element;
            if (view == null)
            {
                return;
            }
 
            var viewType = view.GetType();
            var viewName = viewType.FullName.Replace(".Views.", ".ViewModels.");
            var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
            var viewModelName = string.Format(CultureInfo.InvariantCulture, "{0}ViewModel, {1}", viewName, viewAssemblyName);
 
            var viewModelType = Type.GetType(viewModelName);
            if (viewModelType == null)
            {
                return;
            }
            var viewModel =  Activator.CreateInstance(viewModelType) as BaseViewModel;
            view.BindingContext = viewModel;
        }
}
How to Use: Add this line to your XAML page.

xmlns:models="clr-namespace:CollegeApp.Models"
models:ViewModelLocator.AutoWireViewModel="True"

models: it's folder name where ViewModelLocator exists.




No comments:

Post a Comment

Popular Posts