Xamarin обнаруживающий ключ ввода MVVM - PullRequest
0 голосов
/ 09 мая 2018

Как я могу определить, когда клавиша ввода (или любая другая клавиша) нажата с использованием подхода MVVM. Я новичок в xamarin, поэтому я надеюсь, что задаю правильный вопрос. Я подумал бы добавить команду ввода пароля. Будет ли это правильный подход? Я мог бы добавить Завершенное Событие к внутреннему коду, но как я могу связать это с моей моделью представления?

Вот мой код XAML

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:newApp"
             x:Class="newApp.MainPage">

    <ContentPage.Content>

        <StackLayout Padding="30" Spacing="10" VerticalOptions="Center">

            <Image Source="logo.png" />

            <Entry Text="{Binding Username}" Placeholder="Username"  />

            <Entry Text="{Binding Password}" IsPassword="True" Placeholder="Password" />

            <Label Text="{Binding DisplayMessage}"/>

            <Button Text="Log In" Command="{Binding LogInCommand}"  />

        </StackLayout>

    </ContentPage.Content>
</ContentPage>

Вот код конца

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

    namespace newApp
    {
      public partial class MainPage : ContentPage
      {
          public MainPage()
          {
              InitializeComponent();
              BindingContext = new LoginViewModel();
          }
      }
    }

А вот и моя ViewModel

namespace newApp
{
    class LoginViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        string username, password;
        Boolean bol;

        void OnPropertyChanged([CallerMemberName] string name = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }

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

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

                OnPropertyChanged(nameof(DisplayMessage));
            }
        }

        public string DisplayMessage
        {
            get
            {
                if (username != ""){return $"This is your {Username}";}
                else return "";
            }
        }


        void Login()
        {
            if (username == "")
                bol = false;

        }
    }
}

1 Ответ

0 голосов
/ 09 мая 2018

Короткий ответ: вы не можете.Событие Completed - это просто событие.Из-за способа работы событий они не подходят для шаблона MVVM.

Существует несколько способов сделать это.Сначала вы можете перехватить событие в своем коде, а затем вызвать код в вашей модели представления, которая находится в вашем свойстве BindingContext.Несмотря на то, что вы немного отклонились от шаблона MVVM, это способ обойти это.

Другой вариант - создать собственное наследование элемента управления и реализовать новое свойство, которое принимает Command.Затем вы можете зациклить событие внутри Command.

Но, вероятно, самое простое решение этого - создать Behavior, который превратит ваше событие в Command.Чтобы создать повторно используемый Behavior, который превратит любое событие в нем в Command, реализуйте его следующим образом (полную реализацию можно найти по ссылке ниже):

public class EventToCommandBehavior : BehaviorBase<View>
{
  public static readonly BindableProperty EventNameProperty =
    BindableProperty.Create ("EventName", typeof(string), typeof(EventToCommandBehavior), null, propertyChanged: OnEventNameChanged);
  public static readonly BindableProperty CommandProperty =
    BindableProperty.Create ("Command", typeof(ICommand), typeof(EventToCommandBehavior), null);
  public static readonly BindableProperty CommandParameterProperty =
    BindableProperty.Create ("CommandParameter", typeof(object), typeof(EventToCommandBehavior), null);
  public static readonly BindableProperty InputConverterProperty =
    BindableProperty.Create ("Converter", typeof(IValueConverter), typeof(EventToCommandBehavior), null);

  public string EventName { ... }
  public ICommand Command { ... }
  public object CommandParameter { ... }
  public IValueConverter Converter { ...  }
  ...
}

И для вашего Entry, прикрепите его так:

<Entry Text="{Binding Username}">
  <Entry.Behaviors>
    <local:EventToCommandBehavior EventName="Completed" Command="{Binding CompletedCommand}" />
  </Entry.Behaviors>
</Entry>

Подробнее об этом можно узнать в документации: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/behaviors/reusable/event-to-command-behavior

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