XAML代码:
<DatePicker Date="{Binding DateTimeOffsetTest}"></DatePicker>
DataContext设置为App.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中的静态实例。 我将此代码添加到按钮的点击事件处理程序中:
App.ViewModel.DateTimeOffsetTest = new DateTimeOffset(new DateTime(1988, 09, 11));;
问题是DatePicker的行为类似于它的OneTime绑定。如果我在ViewModel中更新属性,则DatePicker不会更新。我尝试将模式设置为OneWay并更改UpdateSourceTrigger,但它无法正常工作。
有没有人有解决方案?
答案 0 :(得分:0)
(注意,这个答案适用于问题的原始代码)
OnPropertyChanged("");
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
在这种情况下,只有在方法调用中使用OMIT参数时,才会为propertyName
提供。
“来电者信息”属性不会使参数成为可选参数。相反,它们会影响在省略参数时传递的默认值。
如果您将任何值传递给方法,它将覆盖CallerMemberNameAttribute
指定的值。
在您的属性设置器中,执行以下操作:
public DateTimeOffset DateTimeOffsetTest
{
get { return _dateTimeOffsetTest; }
set
{
_dateTimeOffsetTest = value;
OnPropertyChanged(); // LOOK HERE
}
}
框架将为方法提供调用者的名称,因为您没有提供调用者。您的绑定现在可以正常工作。
答案 1 :(得分:0)
显然,DatePicker的OneWay绑定模式会被窃听,并且不会反映更改。你可以解决&#34;将绑定模式设置为TwoWay的问题。
<DatePicker Date="{Binding DateTimeOffsetTest, Mode=TwoWay}">