Windows Phone从MainViewModel加载数据

时间:2012-11-05 23:25:15

标签: windows-phone-7

可能是Noob的问题。 我正在开发一个mvm wp7应用程序,其中地图显示沙龙的图钉。从链接中检索数据库。

我遇到的问题是可观察的集合数据没有从App._ViewModel加载(json序列化程序解析数据库并且工作正常)。在调试时,应用程序会显示一张普通的地图,就是全部。从数据库返回字符串属性会导致该代码中断。我也尝试过messagebox来显示字符串,但仍然崩溃。

下面是代码:

mainviewmodel.cs

  

公共类MainViewModel       {
          public bool IsDataLoaded {get;私人集; }

    public ObservableCollection<SalonViewModel> SalonCollection { get; private set; }


    public MainViewModel()
    {
        IsDataLoaded = false; 
    }

    public ObservableCollection<SalonViewModel> LoadData()
    {
        SalonCollection = new ObservableCollection<SalonViewModel>();
        var wednesday = new Uri("http://blehbleh.txt");
        WebClient wc = new WebClient();
        wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
        wc.OpenReadAsync(wednesday);

        return SalonCollection;
    }

    public void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    { 
        try
        { 
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ObservableCollection<SalonViewModel>));
            ObservableCollection<SalonViewModel> list = serializer.ReadObject(e.Result) as ObservableCollection<SalonViewModel>;

            foreach (SalonViewModel b in list)
            { 
               SalonCollection.Add(new SalonViewModel { sid=b.sid,sname=b.sname,sgeo_lat=b.sgeo_lat,sgeo_lon=b.sgeo_lon, 

            }

            this.IsDataLoaded = true;

        }
        catch (Exception ex)
        {
            //throw ex;
            MessageBox.Show(ex.Message);
        }
    }

App.cs

  

公共部分类App:应用程序       {

    private static MainViewModel viewModel;

    public static MainViewModel _viewModel
    { 
        get
        {
            if (viewModel == null)
            {
                viewModel = new MainViewModel();
            }

            return viewModel;
        }
    }

    void LoadData()
    {
        if (!_viewModel.IsDataLoaded)
        {
            _viewModel.LoadData();
        }
    }
     

继承mappage.cs

  

private void salon_map_Loaded(object sender,RoutedEventArgs e)                {

             foreach (SalonViewModel Salon in App._viewModel.LoadData)
             {
                 MessageBox.Show(Salon.sname);
                 Pushpin p = new Pushpin();
                 p.Content = Salon.sname + System.Environment.NewLine + "Rate: "; 
                 Layer.AddChild(p, new GeoCoordinate(Salon.sgeo_lon, Salon.sgeo_lat)); 
             }

             Map1.Children.Add(Layer); 

         }

1 个答案:

答案 0 :(得分:1)

MainViewModel LoadData函数中,OpenReadAsync()是一个异步函数,因此在下一行返回SalonCollection将返回空ObservableCollection,因为回调函数wc_OpenReadCompleted尚未运行。

此外,MessageBox.Show崩溃的原因是因为您试图在非UI线程上调用UI函数(此处的解决方案:Dispatcher.Invoke() on Windows Phone 7?

尝试将ObservableCollection的{​​{1}}图层绑定到视图模型的MapItemsControl,而不是返回Map并手动将子图片添加到地图中。这里有一个很好的例子:Binding Pushpins to Bing Maps in Windows Phone