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,但它不起作用。
有人有解决方案吗?
(注意,此答案适用于问题的原始代码)
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}">