Как мога да добавя проверка за валидиране на минимална дата за DatePicker в Xamarin

Имам две DatePicker (наименувани fromdate и todate) и бутон (наименуван като save).

По подразбиране днешната дата ще бъде попълнена и в DatePicker. И добавих валидиране на минимална дата (потребителят може да избере само днешна или по-голяма дата.

Ако днешната дата е 30 май и потребителят избере 15 юни от fromdate и щракне OK. Сега днешната дата по подразбиране се показва в todate. Искам потвърждение като ако потребителят избере 15 юни в fromdate и щракне върху OK, тогава todate трябва да бъде попълнено с fromdate.


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


Отговори (2)


Това може да стане чрез обвързване на MinimumDate на toDate DatePicker към свойството 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