Пользовательский степпер Xamarin Forms с 2 кнопками и входом - PullRequest
0 голосов
/ 19 ноября 2018

Я реализовал этот CustomStepper:

 using System;
    using Xamarin.Forms;

    namespace AppXamarin
    {
        public class CustomStepper : StackLayout
        {

            Button PlusBtn;
            Button MinusBtn;
            Entry Entry;

            public static readonly BindableProperty TextProperty =
              BindableProperty.Create(
                 propertyName: "Text",
                  returnType: typeof(int),
                  declaringType: typeof(CustomStepper),
                  defaultValue: 0,
                  defaultBindingMode: BindingMode.TwoWay);

            public int Text
            {
                get { return (int)GetValue(TextProperty); }
                set { SetValue(TextProperty, value); }
            }
            public CustomStepper()
            {
                PlusBtn = new Button { WidthRequest = 30, HeightRequest = 30 };
                MinusBtn = new Button { WidthRequest = 30, HeightRequest = 30 };
                PlusBtn.Image = "exp20181029Artboard51";
                MinusBtn.Image = "exp20181029Artboard52";
                switch (Device.RuntimePlatform)
                {
                    case Device.UWP:
                    case Device.Android:
                        {
                            PlusBtn.BackgroundColor = Color.Transparent;
                            MinusBtn.BackgroundColor = Color.Transparent;
                            break;
                        }
                    case Device.iOS:
                        {
                            PlusBtn.BackgroundColor = Color.Transparent;
                            MinusBtn.BackgroundColor = Color.Transparent;
                            break;
                        }
                }
                Orientation = StackOrientation.Horizontal;
                PlusBtn.Clicked += PlusBtn_Clicked;
                MinusBtn.Clicked += MinusBtn_Clicked;
                Entry = new Entry { PlaceholderColor = Color.Gray, Keyboard = Keyboard.Numeric, WidthRequest = 30, BackgroundColor = Color.Transparent, FontSize = 15 };
                Entry.Keyboard = Keyboard.Numeric;
                Entry.Behaviors.Add(new NumericValidationBehavior());
                Entry.SetBinding(Entry.TextProperty, new Binding(nameof(Text), BindingMode.TwoWay, source: this));
                Entry.HorizontalTextAlignment = TextAlignment.Center;
                Entry.TextChanged += Entry_TextChanged;
                Children.Add(MinusBtn);
                Children.Add(Entry);
                Children.Add(PlusBtn);
            }
            private void Entry_TextChanged(object sender, TextChangedEventArgs e)
            {
                if (!string.IsNullOrEmpty(e.NewTextValue) && e.NewTextValue != ".")
                    this.Text = int.Parse(e.NewTextValue);
            }

            private void MinusBtn_Clicked(object sender, EventArgs e)
            {
                if (Text > 0)
                    Text--;
            }

            private void PlusBtn_Clicked(object sender, EventArgs e)
            {
                Text++;
            }

        }
    }

При нормальном размещении на странице я могу получить к нему доступ, взять свойство text и использовать его в своем коде Xaml.cs. Но в моем случае я помещаю его в просмотр списка, и, как вы знаете, из списка можно связать элементы, я не могу получить к нему доступ напрямую. В обычном степпере, когда он помещен в просмотр списка, мы можем использовать метод «ValueChanged» и легко получить значение, используя e.NewValue в методе «ValueChanged» в файле Xaml.cs. Можно ли как-то добавить в класс CustomStepper что-то, что может помочь мне получить доступ к свойству Text и использовать его в файле Xaml.cs? Заранее спасибо

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете создать свойство за EventHandler с.В этом случае вы должны использовать модификатор event в свойстве, чтобы сообщить программе, что свойство вызывает событие.Например:

private EventHandler onValueChangedEvent = null;

public event EventHandler OnValueChanged
{
    add
    {
        onValueChangedEvent = null;
        onValueChangedEvent = value;
    }
    remove
    {
        // Will show a warning. You can ignore it.
        onValueChangedEvent = null;
    }
}

private void Entry_TextChanged(object sender, TextChangedEventArgs e)
{
    if (!string.IsNullOrEmpty(e.NewTextValue) && e.NewTextValue != ".")
        this.Text = int.Parse(e.NewTextValue);

    onValueChangedEvent?.Invoke(this, e);
}

Затем вы должны привязать / назначить обработчик событий в вашем коде xaml.cs для свойства OnValueChanged, которое будет срабатывать при изменении значения.

...