TimePicker.Time = значение обновляет значение времени, но не текст в TimePickerRenderer (Xamarin.Android) - PullRequest
0 голосов
/ 04 сентября 2018

Я сделал пользовательский TimePicker для формата 24H, особенно в iOS. Однако моя проблема в Android Renderer. На моей странице есть два TimePicker, и когда я обновляю значение в одном из них, я также должен суммировать это значение с другим временем выбора.

ANDROID RENDERER

public class CustomTimePickerRenderer : ViewRenderer<TimePicker, Android.Widget.EditText>, TimePickerDialog.IOnTimeSetListener, IJavaObject, IDisposable
{
    TimePickerDialog dialog;
    public CustomTimePickerRenderer(Context context) : base(context)
    {

    }
    Context CurrentContext => Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity;
    IElementController ElementController => Element as IElementController;
    protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e)
    {
        base.OnElementChanged(e);

        SetNativeControl(new Android.Widget.EditText(CurrentContext));

        if (Control != null)
        {
            Control.Click += Control_Click;
            Control.FocusChange += Control_FocusChange;
            this.Control.KeyListener = null;

            DateTime d = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);

            if (Element != null && !Element.Time.Equals(default(TimeSpan)))
                Control.Text = Element.Time.ToString(@"hh\:mm");
            else
                Control.Text = d.ToString("HH:mm");
        }
    }
    void Control_FocusChange(object sender, FocusChangeEventArgs e)
    {
        if (e.HasFocus)
        {
            ShowTimePicker();
            ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, true);
        }
        else
        {
            ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false);
        }
    }
    void Control_Click(object sender, EventArgs e)
    {
        ShowTimePicker();
    }
    void ShowTimePicker()
    {
        if (dialog == null)
            dialog = new TimePickerDialog(CurrentContext, this, Element.Time.Hours, Element.Time.Minutes, true);

        dialog.UpdateTime(Element.Time.Hours, Element.Time.Minutes);

        dialog.Show();
    }

    public void OnTimeSet(Android.Widget.TimePicker view, int hourOfDay, int minute)
    {
        var time = new TimeSpan(hourOfDay, minute, 0);
        Element.SetValue(TimePicker.TimeProperty, time);

        Control.Text = time.ToString(@"hh\:mm");

        ClearFocus();
    }
}

XAML

        <local:CustomTimePicker x:Name="TempoAttesa" Unfocused="AggiornaDurata" Format="HH:mm"/>
        <local:CustomTimePicker x:Name="Durata" Time="{Binding Durata, Mode=TwoWay}" Format="HH:mm"/>

C #

private void AggiornaDurata(object sender, EventArgs e)
{
    Durata.Time += TempoAttesa.Time;
}

Метод AggiornaDurata просто суммирует время одного TimePicker со временем другого TimePicker. Значение Durata.Time обновлено, но текст не отображается.

Итак, я что-то забыл в рендерере?

...