Как добавить проверку минимальной даты для DatePicker в Xamarin

У меня есть два DatePicker (с именами fromdate и todate) и кнопка (с именем save).

По умолчанию сегодняшняя дата будет указана как в полях DatePicker. И я добавил проверку минимальной даты (пользователь может выбрать только сегодняшнюю или более позднюю дату.

Если сегодняшняя дата — 30 мая, а пользователь выбирает 15 июня из fromdate и нажимает «ОК». Теперь сегодняшняя дата по умолчанию отображается в todate. Мне нужна проверка, например, если пользователь выбирает 15 июня в fromdate и нажимает «ОК», тогда todate должен быть заполнен fromdate.


person Navin Samuel    schedule 15.07.2017    source источник


Ответы (2)


Это можно сделать, привязав MinimumDate DatePicker toDate к свойству FromDate.

Я не знаю вашего кода, поэтому приведу пример:

Представьте, что у вас есть такой 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-YourProject" 
    x:Class="YourProject.YourClass">

    <StackLayout>
        <DatePicker Date="{Binding FromDate}" MinimumDate="{Binding FromMiminumDate}" />

        <DatePicker Date="{Binding ToDate}" MinimumDate="{Binding FromDate}" />
    </StackLayout>
</ContentPage>

И у вас есть такая ViewModel:

public class YourViewModel : INotifyPropertyChanged
{
    public YourViewModel ()
    {
        FromMiminumDate = DateTime.Today;
    }

    private DateTime _fromDate;
    public DateTime FromDate
    {
        get { return _fromDate; }
        set
        {
            if (_fromDate == value)
                return;

            _fromDate = value;
            NotifyPropertyChanged (nameof(FromDate));
        }
    }

    private DateTime _toDate;
    public DateTime ToDate
    {
        get { return _toDate; }
        set
        {
            if (_toDate == value)
                return;

            _toDate = value;
            NotifyPropertyChanged (nameof(ToDate));
        }
    }

    private DateTime _fromMiminumDate;
    public DateTime FromMiminumDate
    {
        get { return _fromMiminumDate; }
        set
        {
            if (_fromMiminumDate == value)
                return;

            _fromMiminumDate = value;
            NotifyPropertyChanged (nameof(FromMiminumDate));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    void NotifyPropertyChanged (string propertyName)
    {
        PropertyChanged?.Invoke (this, new PropertyChangedEventArgs (propertyName));
    }
}

Это приведет к тому, что каждый раз, когда вы меняете дату, выбранную в средстве выбора FromDate, значение MinimumDate для средства выбора ToDate также будет изменяться.

И, конечно же, код XAML будет таким же простым, как:

public YourClass ()
{
    var VM = new YourViewModel ();

    InitializeComponent ();

    BindingContext = VM;
}

Надеюсь это поможет.

person pinedax    schedule 15.07.2017

Итак, у вас есть два DatePickers: fromDate и toDate.

Вы можете добавить в свой fromDate атрибут, который называется «PropertyChanged»:

<DatePicker
x:Name="fromDate"
PropertyChanged="FromDate_Changed"
/>

<DatePicker
x:Name="toDate"
/>

Теперь вы можете зайти в свой файл xaml.cs и добавить в конструктор следующее:

public ItemsPage()
{
    InitializeComponent();
    fromDate.MinimumDate = DateTime.Now;
    toDate.MinimumDate = DateTime.Now;
}

Теперь с обоими DatePickers вы должны выбрать дату, которая не из прошлого.

Затем вы можете создать метод FromDate_Changed (если он не был создан автоматически):

private void FromDate_Changed(object sender, PropertyChangedEventArgs e)
{
    toDate.MinimumDate = fromDate.Date;
}

Теперь каждый раз, когда вы меняете дату в средстве выбора fromDate, минимальная дата с toDate будет автоматически меняться на дату, выбранную вами в fromDate.

Я знаю, что этому вопросу 2 года, но, возможно, на будущее, если кто-то ищет именно эту проблему, он найдет более простое решение.

Извините за мой английский, пожалуйста.

person Albatross    schedule 05.02.2020