2

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

我正在努力解决的问题是未从 App._ViewModel 加载可观察的集合数据(其中 json 序列化程序解析数据库并且工作正常)。在调试应用程序时会显示一个简单的地图,仅此而已。从数据库返回字符串属性会导致该代码中断。我也尝试过消息框来显示字符串,但仍然崩溃。

继承人的代码:

主视图模型.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);
        }
    }

应用程序.cs

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

    private static MainViewModel viewModel;

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

            return viewModel;
        }
    }

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

ETC

这是mappage.cs

私人无效沙龙地图加载(对象发送者,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); 

         }
4

1 回答 1

1

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

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

与其返回ObservableCollection并手动将子级添加到地图中,不如尝试将MapItemsControl一层绑定MapObservableCollection您的视图模型。这里有一个很好的例子:Binding Pushpins to Bing Maps in Windows Phone

于 2012-11-06T01:43:15.313 回答