Проблемы с привязкой карт Bing

У меня настоящая головная боль, привязывающая мои предметы к канцелярским кнопкам на карте Silverlight Bing.

Я потратил весь день, пытаясь отсортировать свою коллекцию, и теперь просто не могу заставить кнопки появиться.

Элементы появляются там, когда вы ставите точку останова на последней строке, как показано на изображении ниже, все 143 элемента находятся в _PushPins:

альтернативный текст

Приветствуется любая помощь. огромное спасибо.

Вот код:

 namespace observable_collection_test
{
public partial class Map : PhoneApplicationPage
{

    public Map()
    {
        InitializeComponent();

        GetItems();
    }

    private ObservableCollection<SItem2> pushPins; 
    public ObservableCollection<SItem2> PushPins 
    {   
        get  { return this.pushPins; }   
        set   
        {     
         this.pushPins = value;

        this.OnPropertyChanged("PushPins");   
         } 
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

    }


 public void GetItems()
    {

         var document = XDocument.Load("ListSmall.xml");

         if (document.Root == null)
            return;

          var xmlns = XNamespace.Get("http://www.blah");

         var events = from ev in document.Descendants("item")
          select new
          {
           Latitude = Convert.ToDouble(ev.Element(xmlns + "Point").Element(xmlns + "lat").Value),
            Longitude = Convert.ToDouble(ev.Element(xmlns + "Point").Element(xmlns + "long").Value),

         };

         this.PushPins = new ObservableCollection<SItem2>();   
         foreach (var ev in events)   
          {     
         var pushPin = new SItem2(ev.Latitude, ev.Longitude);
         //Location = new GeoCoordinate(ev.Latitude, ev.Longitude )
         this.PushPins.Add(pushPin);   
         } 
}

Другой класс:

namespace observable_collection_test
{
 public class SItem2
{
           public double Latitude
    { get; set; }
    public double Longitude
    { get; set; }

    public SItem2(double Latitude, double Longitude)
    {
                    this.Latitude = Latitude;
        this.Longitude = Longitude;
              }

    public Location Location { get; set; }
}
}

XAML:

 <my:Map ZoomBarVisibility="Visible" ZoomLevel="10" CredentialsProvider="xxxxx"  Height="508" HorizontalAlignment="Left" Margin="0,22,0,0" Name="map1" VerticalAlignment="Top" Width="456" ScaleVisibility="Visible">
                  <my:MapItemsControl ItemsSource="{Binding PushPins}" >
                <my:MapItemsControl.ItemTemplate>
                    <DataTemplate>        
             <my:Pushpin Background="Aqua" Location="{Binding Location}" ManipulationCompleted="pin_click">
                        </my:Pushpin></DataTemplate>
                </my:MapItemsControl.ItemTemplate>
            </my:MapItemsControl>
 </my:Map>

person Dan Sewell    schedule 16.01.2011    source источник


Ответы (2)


Вы пытаетесь выполнить привязку к частному полю _PushPins вместо общедоступного свойства PushPins. Также не забудьте реализовать INotifyPropertyChanged, если вы меняете коллекцию после привязки.

person Martin Doms    schedule 16.01.2011
comment
Спасибо за ваш ответ Мартин. Я отредактировал свой код и изображение так, как я думал, может быть проблемой. До сих пор нет радости. Нужен ли мне какой-то набор аксессуаров для общедоступных ObservableCollection‹SItem2› PushPins? - person Dan Sewell; 17.01.2011
comment
Да, вы можете привязываться только к свойствам, а не к полям. Кроме того, ваш XAML по-прежнему ссылается на _PushPins. - person devdigital; 17.01.2011
comment
Ах, использование XAML было ошибкой из-за игры. ошибка школьника. Я не совсем уверен, что я делаю с аксессором get/set, я отредактировал его, и, конечно, все еще без радости :( Я уверен, что для эксперта очевидно, что здесь не так :-) - person Dan Sewell; 17.01.2011
comment
Вы получаете ошибку времени выполнения? В геттере PushPins вы возвращаете само значение свойства, что может вызвать исключение StackOverflowException. - person devdigital; 17.01.2011

Я бы сделал две вещи: во-первых, реализовал INotifyPropertyChanged и сделал так, чтобы ваше свойство PushPins использовало приватное резервное поле. В геттере просто верните значение поля, в сеттере обновите значение поля и вызовите событие PropertyChanged.

Затем в вашем цикле вместо метода getItems (я бы использовал PascalCase для имен методов), создавая локальную ObservableCollection, создайте экземпляр коллекции PushPins и заполните ее напрямую.

private ObservableCollectin<SItem2> pushPins;
public ObservableCollection<SItem2> PushPins
{
  get { return this.pushPins; }
  set
  {
    this.pushPins = value;
    this.OnPropertyChanged("PushPins");
  }
}

public void GetItems()
{
  ...

  this.PushPins = new ObservableCollection<SItem2>();
  foreach (var ev in events)
  {
    var pushPin = new SItem2(ev.Latitude, ev.Longitude);
    this.PushPins.Add(pushPin);
  }
}

Заполните свойство SItem2 Location в конструкторе SItem2 вместо того, чтобы использовать широту/долготу, и, как говорит Мартин, если вы хотите, чтобы пользовательский интерфейс обновлялся при изменении значения экземпляра SItem2 в коллекции, тогда также реализуйте INotifyPropertyChanged в свойствах SItem2.

person devdigital    schedule 17.01.2011
comment
Спасибо за вашу помощь. Я обновил код до моего текущего состояния игры. Я не уверен, что я делаю с Location = new GeoCoordinate(ev.Latitude, ev.Longitude) для создания элементов местоположения? Я уверен, что мой недостаток знаний проявляется здесь .. - person Dan Sewell; 17.01.2011
comment
Вы нигде не устанавливаете значение Location, в конструкторе SItem2 вы можете установить this.Location = new Location(this.Latitude, this.Longitude); - person devdigital; 18.01.2011