Windows phone 7 更新第一个方法中的实例,然后在同一命令中继续运行第二个方法
我有一个这样的方法Windows phone 7 更新第一个方法中的实例,然后在同一命令中继续运行第二个方法,windows-phone-7,mvvm-light,Windows Phone 7,Mvvm Light,我有一个这样的方法 public void LoadProgrammeListFromChannel(TVDailyScheduleParam scheduleParam, Action callback) { string url = Helper.GetProgrammeUrl(scheduleParam.Day, scheduleParam.Channel.Id); //1// WebClient client = new W
public void LoadProgrammeListFromChannel(TVDailyScheduleParam scheduleParam, Action callback)
{
string url = Helper.GetProgrammeUrl(scheduleParam.Day, scheduleParam.Channel.Id); //1//
WebClient client = new WebClient(); //2//
client.OpenReadCompleted += new OpenReadCompletedEventHandler((sender, e) => //3//
{//5//
if (e.Error != null)
return;
try
{
_programmeList.Clear();
_programmeList = DataService.GetProgrammeList(e.Result);
// call method in MainVM to update View
callback();
}
finally
{
// close file stream
e.Result.Close();
}
});
client.OpenReadAsync(new Uri(url, UriKind.Absolute)); //4//
}
LoadWhatsonProgrammeCommand = new RelayCommand(()=>
{
foreach (TVDailyScheduleParam param in _tvDailyScheduleVM.ChannelList.Select(c => new TVDailyScheduleParam(DateTime.Today, c, false)))
{
TVDailyScheduleParam param2 = param;
_tvDailyScheduleVM.LoadProgrammeListFromChannel(param2, ()=>
{
RaisePropertyChanged(TV_DAILY_SCHEDULE_VM);
});
_tvDailyScheduleVM.GetWhatsonProgramme(param2, ()=>
{
RaisePropertyChanged(TV_DAILY_SCHEDULE_VM);
});
}
});
我有一个像这样的摄像机
public void LoadProgrammeListFromChannel(TVDailyScheduleParam scheduleParam, Action callback)
{
string url = Helper.GetProgrammeUrl(scheduleParam.Day, scheduleParam.Channel.Id); //1//
WebClient client = new WebClient(); //2//
client.OpenReadCompleted += new OpenReadCompletedEventHandler((sender, e) => //3//
{//5//
if (e.Error != null)
return;
try
{
_programmeList.Clear();
_programmeList = DataService.GetProgrammeList(e.Result);
// call method in MainVM to update View
callback();
}
finally
{
// close file stream
e.Result.Close();
}
});
client.OpenReadAsync(new Uri(url, UriKind.Absolute)); //4//
}
LoadWhatsonProgrammeCommand = new RelayCommand(()=>
{
foreach (TVDailyScheduleParam param in _tvDailyScheduleVM.ChannelList.Select(c => new TVDailyScheduleParam(DateTime.Today, c, false)))
{
TVDailyScheduleParam param2 = param;
_tvDailyScheduleVM.LoadProgrammeListFromChannel(param2, ()=>
{
RaisePropertyChanged(TV_DAILY_SCHEDULE_VM);
});
_tvDailyScheduleVM.GetWhatsonProgramme(param2, ()=>
{
RaisePropertyChanged(TV_DAILY_SCHEDULE_VM);
});
}
});
现在当我调用命令时。首先,它运行\u tvDailyScheduleVM.LoadProgrammeListFromChannel
并调用LoadProgrammeListFromChannel
方法
在LoadProgrammeListFromChannel
方法中,它从1->2->3运行。在3时,它还没有完成,因此它运行到4,然后返回到命令并继续运行\u tvDailyScheduleVM.getwhatsonprogram
但是LoadProgrammeListFromChannel中的\u程序列表未更新,因此GetWhatsonProgram
无法准确运行
在运行\u tvDailyScheduleVM.GetWhatsonProgram
之前,如何从频道返回LoadProgrammeListFromChannel
以运行3更新\u programmeList
?您描述的行为是“按设计”的。您的方法LoadProgrammeListFromChannel
进行异步调用。这意味着在您的方法中,顺序是1->2->3->4->return->executecode in calling function->然后是稍后的某个时间5,然后是回调
因此,LoadProgrammeListFromChannel
和GetWhatsonProgram
并行执行。因此,如果GetWhatsonProgram
需要始终在LoadProgrammeListFromChannel
之后运行,您将有权调用将GetWhatsonProgram
移动到回调方法中,即
LoadWhatsonProgrammeCommand = new RelayCommand(()=> {
var channelList = _tvDailyScheduleVM
.ChannelList
.Select(c => new TVDailyScheduleParam(
DateTime.Today,
c,
false
));
foreach (TVDailyScheduleParam param in channelList) {
TVDailyScheduleParam param2 = param;
_tvDailyScheduleVM.LoadProgrammeListFromChannel(param2, ()=> {
RaisePropertyChanged(TV_DAILY_SCHEDULE_VM);
_tvDailyScheduleVM.GetWhatsonProgramme(param2, ()=> {
RaisePropertyChanged(TV_DAILY_SCHEDULE_VM);
});
});
}
});
或者,您可以订阅ViewModel的PropertyChangedEvent,如果TV\u DAILY\u SCHEDULE\u VM
属性已更改,请从此处调用GetWhatsonProgram
,尽管这可能不是您想要的