Обнаружить изменение свойства элемента управления - PullRequest
0 голосов
/ 06 февраля 2020

В настоящее время я работаю над приложением Xamarin Forms , на странице содержимого базового проекта.

На этой странице у меня есть StackLayout, который содержит некоторые пользовательские элементы управления (с именем Accordion), которые имеют Binding Property ( логическое ), что позволяет мне узнать, является ли их содержимое open или close.

Как я могу определить, какое из аккордеонов нажато и закрыть аккордеоны, для которых установлено открытие?

Я думал добавить TapHandler для каждого моего аккордеона, но мне было интересно, если есть лучшее решение для достижения этой цели.

(мне не интересно открывать нажатую, поскольку у моего элемента управления Accordion есть собственный обработчик нажатий)

Спасибо за ваш ответ.

РЕДАКТИРОВАНИЕ:

Accordion.xaml.cs:

public partial class Accordion : ContentView
{
    public Accordion()
    {
        InitializeComponent();
        IsOpen = false;
        Close();

        Indicator = Img;
    }

    //Elements

    //Some properties

    public static readonly BindableProperty IsOpenProperty = BindableProperty.Create(nameof(IsOpen), typeof(bool), typeof(Accordion), false, propertyChanged: IsOpenChanged);
    public bool IsOpen
    {
        get => (bool)GetValue(IsOpenProperty);
        set => SetValue(IsOpenProperty, value);
    }

    public static readonly BindableProperty AccordionContentProperty = BindableProperty.Create(nameof(AccordionContent), typeof(View), typeof(Accordion), default(View));
    public View AccordionContent
    {
        get => (View)GetValue(AccordionContentProperty);
        set => SetValue(AccordionContentProperty, value);
    }

    //Open handling

    private void TapGestureRecognizer_Tapped(object sender, EventArgs e)
    {
        IsOpen = !IsOpen;
    }

    public static void IsOpenChanged(BindableObject bindable, object oldValue, object newValue)
    {
        if(bindable != null && newValue != null)
        {
            var Control = (Accordion)bindable;

            if(Control.IsOpen == false)
            {
                VisualStateManager.GoToState(Control, "Open");
                Control.Close();
            }
            if(Control.IsOpen == true)
            {
                VisualStateManager.GoToState(Control, "Closed");
                Control.Open();
            }
        }
    }

    public uint AnimationDuration { get; set; } = 250;
    public async void Open()
    {
        _content.IsVisible = true;
        await Task.WhenAll(
            _content.TranslateTo(0, 0, AnimationDuration),
            Img.TranslateTo(-20, 0, AnimationDuration),
            IndicatorOpen(),
            _indicator.RotateTo(0, AnimationDuration),
            _content.FadeTo(30, 50, Easing.SinIn)
            );
    }
    public async Task IndicatorOpen()
    {
        Img.Margin = new Thickness(0, 0, -10, 0);

        return;
    }

    public async void Close()
    {
        await Task.WhenAll(
            _content.TranslateTo(0, 0, AnimationDuration),
            Img.TranslateTo(10, 0, AnimationDuration),
            IndicatorClose(),
            _indicator.RotateTo(-180, AnimationDuration),
            _content.FadeTo(0, 50)
            );
        _content.IsVisible = false;
    }
    public async Task IndicatorClose()
    {
        Img.Margin = new Thickness(0, 0, 0, 0);

        return;
    }
}

TapGestureRecognizer_Tapped - это метод, вызываемый TapHandler при нажатии на голову аккордеона.

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