Карты Bing связывают проблемы - PullRequest
2 голосов
/ 17 января 2011

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

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

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

alt text

Любая помощь приветствуется,Большое спасибо.

Вот код:

 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>

Ответы [ 2 ]

2 голосов
/ 17 января 2011

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

1 голос
/ 17 января 2011

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

Затем в вашем цикле вместо метода getItems (я бы использовал PascalCase для имен методов) создайте локальную коллекцию ObservableCollection, создайте экземпляр коллекции PushPins и заполните ее напрямую.Свойство SItem2 Location в конструкторе SItem2 вместо этого использует широту / долготу, и, как говорит Мартин, если вы хотите, чтобы пользовательский интерфейс обновлялся при изменении значения экземпляра SItem2 в коллекции, тогда реализуйте INotifyPropertyChanged для свойств SItem2.*

...