Xamarin.forms 即使尚未设置绑定属性,日期选择器也会选择所选内容

Xamarin.forms 即使尚未设置绑定属性,日期选择器也会选择所选内容,xamarin.forms,Xamarin.forms,我拿到了我的日期选择器。我检查新提交日期是否等于或大于所选的订单.TargetDate.date。 如果条件不匹配,则检查本身是正常的,不允许检查,但是用户在日历上选择的内容将保留在日历中。为什么calendar设置用户的选择,即使SelectedTargetDate未更改 <DatePicker Date="{Binding SelectedTargetDate, Mode=TwoWay}"/> public DateTime SelectedTargetD

我拿到了我的
日期选择器
。我检查新提交日期是否等于或大于所选的订单.TargetDate.date。 如果
条件
不匹配,则检查本身是正常的,不允许检查,但是
用户
日历
上选择的内容将保留在
日历
中。为什么
calendar
设置用户的选择,即使
SelectedTargetDate
未更改

<DatePicker Date="{Binding SelectedTargetDate, Mode=TwoWay}"/>


public DateTime SelectedTargetDate
        {
            get =>  _selectedTargetDate;
            set
            {
                if (SelectedOrder == null) return;      //on program run first time it's null
                if (value.Date < SelectedOrder.TargetDate.Date)
                    _pageService.DisplayAlert("Ostrzeżenie", "New date cannot be older than TargetDate", "ok", "cancel");
                else
                    SetValue(ref _selectedTargetDate, value);
            }
        }

公共日期时间选定目标日期
{
get=>\您选择的目标日期;
设置
{
if(SelectedOrder==null)return;//在程序第一次运行时为null
if(value.Date
我不知道我是否正确理解您的意思,如果条件不满足,您是否希望保留所选的订单.TargetDate

如果是,您可以让您的模型实现
INotifyPropertyChanged
并进行如下更改:

public class YourModel: INotifyPropertyChanged
{
    ...
    public event PropertyChangedEventHandler PropertyChanged;

    public DateTime SelectedTargetDate
    {
        get => _selectedTargetDate;
        set
        {
            if (SelectedOrder == null) return;      //on program run first time it's null
            if (value.Date < SelectedOrder.Date)
            {
                _pageService.DisplayAlert("Ostrzeżenie", "New date cannot be older than TargetDate", "ok", "cancel");
            }
            else
            {
                _selectedTargetDate = value;
            }
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedTargetDate"));
        }
    }

    
}
公共类YourModel:INotifyPropertyChanged
{
...
公共事件属性更改事件处理程序属性更改;
公共日期时间选定目标日期
{
get=>\您选择的目标日期;
设置
{
if(SelectedOrder==null)return;//在程序第一次运行时为null
如果(value.Date
我已实现InotifyProperty更改,并且_selectedTargetDate仅在条件通过时更改-此部件完全工作。问题是,即使未传递cindition,也意味着当它转到引发_pageService.DisplayAlert的部分时-意味着它未将_selectedTargetDate设置为新值(未设置为_selectedTargetDate=value),但在gui(日期选择器日历)上仍设置了新选择。这就是我不明白的地方。@Arie,因为您错过了
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(“SelectedTargetDate”)
刷新
SelectedTargetDate
如上所述。它将显示您在日历中选择的日期,如果您将
日期绑定到
SelectedTargetDate
,您应该在每次选择日期时更新它。您是对的,即使未更新,我也需要调用propertychanged。我不认为日历会设定日期,即使没有提出财产变更。你能给我解释一下这种行为吗?对我来说,逻辑上是当没有绑定属性被更改时,用户输入的新日期不应保留在calenadar中。@Arie您可以尝试将日期绑定到固定时间,当您在calenadar中选择日期时,它也将更改为新日期。