【问题标题】:DatePicker selects selections even if binded property has not been set即使未设置绑定属性,DatePicker 也会选择选择
【发布时间】:2020-12-24 09:30:19
【问题描述】:

我收到了我的DatePicker。我检查新的发布日期是否是equal or greater 而不是SelectedOrder.TargetDate.Date。 检查本身很好,如果coindition 不匹配,则不允许检查,但是usercalendar 上选择的内容仍保留在calendar 中。为什么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);
            }
        }

【问题讨论】:

    标签: xamarin.forms


    【解决方案1】:

    不知道我对你的理解是否正确,如果条件不满足,要不要保留SelectedOrder.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"));
            }
        }
    
        
    }
    

    【讨论】:

    • 我已经实现了 INotifyPropertyChanged 并且 _selectedTargetDate 仅在条件通过时才会更改 - 这部分完全正常。问题是即使 cindition 没有通过意味着当它进入 _pageService.DisplayAlert 被引发的部分时 - 意味着它没有将 _selectedTargetDate 设置为新值(不去 _selectedTargetDate = 值)但在 gui 上(日期选择器日历)新无论如何都设置了选择。这就是我不明白的。
    • @Arie 因为错过PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedTargetDate")); 刷新SelectedTargetDate 如上。它会显示你在日历中选择的日期,如果你绑定Date to SelectedTargetDate,你应该更新每次选择日期时都会显示。
    • 你说得对,即使没有更新,我也需要调用 propertychanged。即使没有提出属性更改,我也不认为日历会设置日期。你能解释一下这种行为吗?对我来说,逻辑上是当没有更改绑定属性时,用户输入的新日期不应该留在日历中。
    • @Arie 你可以尝试将日期绑定到一个固定的时间,当你在日历中选择日期时,它也会更改为新的日期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多