Да, ваша 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";
}
}
Результат: