Почему эта автоматическая привязка Xamarin.Forms соединяет мою Команду, но не мою Вступление? - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть этот XAML

<?xml version="1.0" encoding="utf-8"?>
<ContentPage
...
    x:Class="MyProj.LoginPageView"
    local:ViewModelLocator.AutoWireViewModel="True">
...cut for brevity...
        <Entry MinimumWidthRequest="60"  Grid.Row="0" Grid.Column="2"  VerticalOptions="Center" Text="{Binding Username, Mode=TwoWay}"/>
        <Entry Grid.Row="1" Grid.Column="2"  VerticalOptions="Center"  Text="{Binding Password, Mode=TwoWay}"/>
        <Button Text="Login" Command="{Binding LoginCommand}"/>
        <Button Text="Register" Command="{Binding RegisterCommand}"/>

Прикрепленный с помощью автоматической проводки к этой модели:

public class LoginPageViewModel: BindableObject
    {
        public ICommand LoginCommand { get; set; }
        public ICommand RegisterCommand { get; set; }

        private string username;
        private string password;

        public string Username { get { return username; } set { username = value; OnPropertyChanged("Username"); } }
        public string Password { get { return password; } set { password = value; OnPropertyChanged("Password"); } }

        public LoginPageViewModel()
        {
            LoginCommand = new Command(() =>
              Login());
            RegisterCommand = new Command(() =>
            Register());
        }

        private void Login()
        {

        }

        private void Register()
        {
            Console.WriteLine("sdfsd");
        }
    }

Привязки команд работают нормально, и методы Register и Login вызываются, когда я нажимаю кнопка. В автоматическом подключении контекст привязки представления устанавливается на модель представления следующим образом:

        static ViewModelLocator()
        {

            _container = new TinyIoCContainer();

            //register viewmodels
            _container.Register<LoginPageViewModel>();
        }
        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}Model, {1}", viewName, viewAssemblyName);

            var viewModelType = Type.GetType(viewModelName);
            if (viewModelType == null)
            {
                return;
            }
            var viewModel = _container.Resolve(viewModelType);
            view.BindingContext = viewModel;
        }

Когда я щелкаю регистр в режиме отладки, вызывается метод регистра, что означает, что привязка команды была подключена, но значение I положить в поля ввода для имени пользователя и пароля не связаны с соответствующими свойствами на виртуальной машине, и свойства просто имеют нулевые значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...