可能是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); }
答案 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