WP8.1 DatePicker绑定-永远不会更新值

本文关键字:更新 永远 DatePicker 绑定 WP8 | 更新日期: 2023-09-27 17:59:03

XAML代码:

<DatePicker Date="{Binding DateTimeOffsetTest}"></DatePicker>

DataContext设置为App.ViewModel(ViewModel的静态实例-仅用于测试!)

ViewModel:

public class ViewModel : INotifyPropertyChanged
    {
        private DateTimeOffset _dateTimeOffsetTest = new DateTimeOffset(new DateTime(1980, 10, 10));
        public DateTimeOffset DateTimeOffsetTest
        {
            get { return _dateTimeOffsetTest; }
            set
            {
                _dateTimeOffsetTest = value; 
                //Was OnPropertyChanged(""); (Thanks to Will for fix)
                OnPropertyChanged();
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            var handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

为了进行测试,我只是将ViewModel初始化为应用程序中的静态实例。我在按钮的点击事件处理程序中添加了以下代码:

App.ViewModel.DateTimeOffsetTest = new DateTimeOffset(new DateTime(1988, 09, 11));;

问题是DatePicker的行为就像它的OneTime绑定一样。如果更新ViewModel中的属性,DatePicker将不会更新。我已经尝试将模式设置为OneWay并更改UpdateSourceTrigger,但它不起作用。

有人有解决方案吗?

WP8.1 DatePicker绑定-永远不会更新值

(注意,此答案适用于问题的原始代码)

OnPropertyChanged("");

是的,不是。您正在为一个不存在的属性提供一个名称(一个无意义的名称——一个空字符串)。

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)

在这种情况下,只有在方法调用中省略参数时,才会提供propertyName

根据MSDN上的参考文档:

呼叫者信息属性不会使参数成为可选参数。相反,当参数被省略时,它们会影响中传递的默认值

如果将任何值传递到方法中,它将覆盖CallerMemberNameAttribute指定的值。

在属性设置器中,执行以下操作:

public DateTimeOffset DateTimeOffsetTest
{
    get { return _dateTimeOffsetTest; }
    set
    {
        _dateTimeOffsetTest = value; 
        OnPropertyChanged();  // LOOK HERE
    }
}

框架将为方法提供调用方的名称,因为您尚未提供。您的绑定现在可以工作了。

显然,DatePicker的单向绑定模式被窃听,更改没有得到反映。您可以通过将绑定模式设置为TwoWay来"解决"该问题。

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