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
,尽管这可能不是您想要的