Windows phone 7 WP7:时间选择器绑定未使用新值更新

Windows phone 7 WP7:时间选择器绑定未使用新值更新,windows-phone-7,data-binding,timepicker,Windows Phone 7,Data Binding,Timepicker,我目前对WP7的TimePicker有一个问题,特别是绑定到ViewModel时。有问题的时间选择器设置一天中的报警时间。首次加载页面时,计时器选择器正确显示报警对象的值(本例中的默认值为12:00am)。但是,当用户选择一个新值时,该值不会反映在模型中,而是被先前的12:00am值覆盖 我正在使用MVVM创建此表单并保存数据绑定。我有什么特别的地方做错了吗 (查看)AlarmEditorControl.xaml (ViewModel)AlarmEditorModel.cs [DataCon

我目前对WP7的TimePicker有一个问题,特别是绑定到ViewModel时。有问题的时间选择器设置一天中的报警时间。首次加载页面时,计时器选择器正确显示报警对象的值(本例中的默认值为12:00am)。但是,当用户选择一个新值时,该值不会反映在模型中,而是被先前的12:00am值覆盖

我正在使用MVVM创建此表单并保存数据绑定。我有什么特别的地方做错了吗

(查看)AlarmEditorControl.xaml


(ViewModel)AlarmEditorModel.cs

[DataContractAttribute]
公共类AlarmEditorModel
{
私有整数指数;
[数据成员属性]
公共警报{get;set;}
[数据成员属性]
公共整数索引
{
得到
{
回归指数;
}
设置
{
_指数=价值;
}
}
公共AlarmEditorModel(整数索引)
{
_指数=指数;
报警=新报警();
//获取警报列表
AlarmSerializer serializer=新的AlarmSerializer();
//检查索引是否在范围内
列表报警=serializer.AlarmList;
如果(_index>-1&&index
(型号)Alarm.cs

[DataContract]
公共类警报:INotifyPropertyChanged
{
私人住宅活跃;
私人日期时间;
[数据成员]
公共字符串名称{get;set;}
[数据成员]
公共日期时间
{
得到
{
返回时间;
}
设置
{
如果(_time!=值)
{
_时间=价值;
RaisePropertyChanged(“时间”);
}
}
}
[数据成员]
公共报警频率{get;set;}
[数据成员]
公共报警音{get;set;}
[数据成员]
公共bool活动{
得到{
返回激活状态;
}
设置{
_活跃=价值;
} 
}
公共字符串AlarmTimeString{
得到{
返回时间。ToShortTimeString();
}
}
/**
*默认构造函数
*/
公共警报()
{
WriteLine(“报警:使用默认构造函数”);
this.Name=“新建报警”;
this.Time=DateTime.Today;
this.Frequency=新的报警频率();
this.Tone=新的AlarmTone();
这个.Active=true;
Debug.WriteLine(“报警小时数为”+此时间小时数);
}
/**
*参数化构造函数
*/
公共报警(字符串名称、日期时间、报警频率、,
报警音,布尔激活)
{
WriteLine(“报警:使用参数化构造函数”);
this.Name=Name;
这个。时间=时间;
这个。频率=频率;
这个。音调=音调;
这个。主动=主动;
}
}
(呼叫页面)NewAlarm.xaml.cs

私有列表提要;
专用AlarmEditorModel_aem;
私有整数指数;
公共警报()
{
初始化组件();
feed=新列表();
添加(新通道(null,null,“提要1”,DateTime.Now));
添加(新通道(null,null,“提要2”,DateTime.Now));
}
/**
*加载页面时,设置功能正常
*/
受保护的覆盖无效OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
//函数变量+调试
Debug.WriteLine(“导航到”);
//检查我们是否正在从墓碑镇恢复
如果(!StateUtilities.IsLaunching&&this.State.ContainsKey(“AlarmState”))
{
//恢复保存的模型
_aem=(AlarmEditorModel)this.State[“AlarmState”];
}
其他的
{
尝试
{
//编辑警报。
_index=Convert.ToInt32(this.NavigationContext.QueryString[“index”]);
Debug.WriteLine(“编辑报警”);
}
捕获(KeyNotFoundException knfe)
{
Debug.WriteLine(knfe.Message);
//未提供索引,新警报
_指数=-1;
}
//从索引中设置模型
_aem=新的AlarmEditorModel(_索引);
}
AlarmEditor.DataContext=\u aem.Alarm;
调试写入线(_aem.Alarm.Time.Hour);
}
/**
*在逻辑删除时保留报警详细信息
*/
受保护的覆盖无效OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
基于(e)的导航;
if(this.State.ContainsKey(“AlarmState”))
{
this.State[“AlarmState”]=\u aem;
}
其他的
{
this.State.Add(“AlarmState”,_aem);
}
StateUtilities.IsLaunching=false;
}

编辑1

它将出现报警设置器。时间被调用两次。通过将以下调试行添加到时间属性:

[DataMember]
公共日期时间
{
得到
{
返回时间;
}
设置
{
WriteLine(“当前时间为”+_time.ToShortTimeString());
WriteLine(“新时间为”+value.ToShortTimeString());
如果(_time!=值)
{
Debug.WriteLine(“更改时间值”);
_时间=价值;
RaisePropertyChanged(“时间”);
Current time is 4:00 AM
New time is 9:10 AM 
Changing time value
Current time is 12:00 AM 
New time is 4:00 AM 
Changing time value