Как привязать указатель даты к viewModel? - PullRequest
0 голосов
/ 26 сентября 2019

Как получить значение из DatePicker и установить его в переменной в ViewModel?В моем файле xaml у меня есть средство выбора даты, например:

<DatePicker x:Name="dateTo"
    TextColor="White"
    FontSize="Small"
    Date="{Binding DateTo}"
    HorizontalOptions="StartAndExpand"
    VerticalOptions="CenterAndExpand"
    IsVisible="{Binding DateToPickerVisibility}"
    Margin="5,0,0,0"
    IsEnabled="False"/>

В моем ViewModel у меня есть свойство

public DateTime DateTo { get; set; }

и я устанавливаю его значение в методе InidData:

DateTo = DateTime.Now.Date.AddDays(1); 

Но как изменить это значение при изменении даты и нажатии кнопки «ОК» на сборщике?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Да, ваша ViewModel должна реализовывать INotifyPropertyChanged, чтобы DatePicker мог автоматически обновлять значение.

Существует полная демонстрация, которая работает правильно.Основной код:

 public class DateViewModel: INotifyPropertyChanged
{
    bool _dateToPickerVisibility;

    public bool DateToPickerVisibility
    {
        set { SetProperty(ref _dateToPickerVisibility, value); }
        get { return _dateToPickerVisibility; }
    }

    DateTime _dateTo;
    public DateTime DateTo
    {
        set { SetProperty(ref _dateTo, value); }
        get { return _dateTo; }
    }

    public DateViewModel()
    {
        DateTo = DateTime.Now.Date.AddDays(1);
        DateToPickerVisibility = true;
    }

    bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
    {
        if (Object.Equals(storage, value))
            return false;

        storage = value;
        OnPropertyChanged(propertyName);
        return true;
    }

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

MainPage.xaml

 <StackLayout VerticalOptions="CenterAndExpand" HorizontalOptions="Start">
    <DatePicker x:Name="dateTo"
                FontSize="Small"
                Date="{Binding DateTo}"
                HorizontalOptions="StartAndExpand"
                VerticalOptions="Start"
                IsVisible="{Binding DateToPickerVisibility}"
                Margin="5,0,0,0"/>

    <Button x:Name="mButton" 
            Text="Hide DatePicker"
            Clicked="MButton_Clicked"
            VerticalOptions="Center"
            />
</StackLayout>

MainPage.xaml.cs

public partial class MainPage : ContentPage
 {
    DateViewModel dateViewModel;

    public MainPage()
    {
        InitializeComponent();
        dateViewModel = new DateViewModel();
        BindingContext = dateViewModel;

    }

    private void MButton_Clicked(object sender, EventArgs e)
    {
        if (dateViewModel.DateToPickerVisibility) {
            dateViewModel.DateToPickerVisibility = false;
            mButton.Text = "Make DatePicker visible";
        }
        else {
            dateViewModel.DateToPickerVisibility = true;
            mButton.Text = "Hide DatePicker";
        }
    }
}

Примечание:

1.Вы можете инициировать значение в конструкторе вашего ViewModel.eg

 public DateViewModel()
    {
        DateTo = DateTime.Now.Date.AddDays(1);
        DateToPickerVisibility = true;
    }

2. Чтобы сделать DatePicker видимым или скрытым, я добавил кнопку, чтобы изменить значение DateToPickerVisibility.

  private void MButton_Clicked(object sender, EventArgs e)
    {
        if (dateViewModel.DateToPickerVisibility) {
            dateViewModel.DateToPickerVisibility = false;
            mButton.Text = "Make DatePicker visible";
        }
        else {
            dateViewModel.DateToPickerVisibility = true;
            mButton.Text = "Hide DatePicker";
        }
    }

Результат:

enter image description here

0 голосов
/ 26 сентября 2019

Ваш XAML выглядит нормально.

Однако ваша собственность в ViewModel не вызывает PropertyChanged.Когда значение свойства в ViewModel изменяется, ему необходимо вызвать PropertyChanged?.Invoke для предупреждения / обновления представления.

Вот пример XAML, его Code-Behind и его ViewModel:

XAML

<DatePicker x:Name="dateTo"
    TextColor="White"
    FontSize="Small"
    Date="{Binding DateTo}"
    HorizontalOptions="StartAndExpand"
    VerticalOptions="CenterAndExpand"
    IsVisible="{Binding DateToPickerVisibility}"
    Margin="5,0,0,0"
    IsEnabled="False"/>

Код позади

public partial class MyView
{
    InitializeComponent();
    BindingContext = new MyViewModel();
}

ViewModel

public class MyViewModel : INotifyPropertyChanged
{
    bool _dateToPickerVisibility
    DateTime _dateTo

    public event PropertyChangedEventHandler PropertyChanged;

    public DateTime DateTo
    {
        get => _dateTo;
        set
        {
            _dateTo = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DateTo)));
        }
    }

    public bool DateToPickerVisibility
    {
        get => _dateToPickerVisibility;
        set 
        {
            _dateToPickerVisibility = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DateToPickerVisibility)));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...