2012-02-11 12 views
1

Bingマップにプッシュピンを追加しようとしています。プッシュピンはJSONフィードから取得します。私はこのようなものを得たいと思っています: enter image description here 私のコードは初めてでは機能しません。その理由を理解できません。BingマップにPushPinsを追加する

//Map.xaml.cs 
public partial class Map : PhoneApplicationPage 
{ 
    #define DEBUG_AGENT 
    private IGeoPositionWatcher<GeoCoordinate> watcher; 
    private MapViewModel mapViewModel; 

    public Map() 
    { 
     InitializeComponent(); 
     mapViewModel = new MapViewModel(); 
     this.DataContext = mapViewModel; 
    } 

    private void page_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (watcher == null) 
     { 

    #if DEBUG_AGENT 
      watcher = new Shoporific.My.FakeGPS(); 
    #else  
      watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default); 
    #endif 
     } 
     watcher.Start(); 

     mapViewModel.Center = watcher.Position.Location; 
     PushpinModel myLocation = new PushpinModel() { Location = mapViewModel.Center, Content = "My Location" }; 
     MapViewModel.Pushpins.Add(myLocation); 
     myLocation.RefreshNearbyDeals(); 
     watcher.Stop(); 
    } 
} 

最後に、PushPinModelClass:

public class PushPinModel 
{ 
    public void RefreshNearbyDeals() 
    { 
     System.Net.WebClient wc = new WebClient(); 
     wc.OpenReadCompleted += wc_OpenReadCompleted; 
     wc.OpenReadAsync(" a valid uri"); 
    } 

    void wc_OpenReadCompleted(object sender, System.Net.OpenReadCompletedEventArgs e) 
    { 
     var jsonStream = e.Result; 
     DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Deal[])); 
     Deal[] deals = (ser.ReadObject(jsonStream) as Deal[]); 

     if (deals.Any()) 
     { 
       var currentLocation = MapViewModel.Pushpins.Where(pin => pin.Content == "My Location"); 
       MapViewModel.Pushpins = new ObservableCollection<PushpinModel>(); 
       foreach (var deal in deals) 
        MapViewModel.Pushpins.Add(new PushpinModel() 
        { 
         Content = deal.Store, 
         Location = new GeoCoordinate(deal.Location.Latitude, deal.Location.Longtitude), 
         Offers = deal.Offers, 
        }); 

     } 
    } 
} 

は、私が "現在地" を除いてプッシュピンそのビット混乱しています マイマップのViewModelは

public class MapViewModel : INotifyPropertyChanged 
{ 
    public static ObservableCollection<PushpinModel> pushpins = new ObservableCollection<PushpinModel>(); 
    public static ObservableCollection<PushpinModel> Pushpins 
    { 
      get { return pushpins; } 
     set { pushpins = value; } 
    } 
} 

地図XAML csがあるあります最初だけには表示されません。 2回目以降は期待どおりに表示されます(戻ると地図画面に再度移動した場合)。

+0

あなたのためのクイックヒント、WP7.1ツールでは、エミュレータにはGPSシミュレータがあります。 Shoporific.My.FakeGPSクラスは必要ありません。 – ColinE

+0

うん、@コリン:私はそれについて知っていた。しかし、私はデバッガが接続されていなくても偽のGPSを望んでいました。 #def DEBUG_AGENTに注目してください。地図がジャコブ&ジャビットセンターの中心になるようにするためには、これが必要でした。私はプロトタイプとしてこれをやっています。 – gprasant

答えて

1

wc_OpenReadCompletedの内部には、MapViewModel.Pushpinsを再インスタンス化しています。

コンストラクタをObservableCollectionに一度だけ呼び出します(MainViewModel内の場合)。それをもう一度呼び出すと、xamlページにあると想定しているバインディングが崩れます。

私は、PushpinViewModelでその行を削除するか、代わりにMainViewModel.Pushpins.Clear()を呼び出してください(達成しようとしていることによる)。

関連する問題