Добавление PushPins в Bing Maps - PullRequest
       7

Добавление PushPins в Bing Maps

1 голос
/ 11 февраля 2012

Я пытаюсь добавить кнопки на карту Bing. Канцелярские кнопки получены из канала JSON. Я хотел бы получить что-то вроде этого: enter image description here Мой код не работает в первый раз, и я не могу понять, почему. Моя карта 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:

//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,
                    });

        }
    }
}

Я немного озадачен тем, что защелки, кроме «Мое местоположение», не отображаются только в первый раз. Они появляются, как и ожидалось, во второй раз (если я вернусь назад, а затем снова вернусь к экрану карты).

1 Ответ

1 голос
/ 11 февраля 2012

Внутри wc_OpenReadCompleted, вы восстанавливаете MapViewModel.Pushpins.

Вызывайте конструктор ObservableCollection только один раз (в вашем случае в пределах MainViewModel). Повторный вызов нарушает связывание, которое, как я полагаю, имеется на вашей странице xaml.

Я считаю, что вы должны либо удалить эту строку в PushpinViewModel, либо вместо этого вызвать MainViewModel.Pushpins.Clear() (в зависимости от того, что вы пытаетесь выполнить).

...