2

Ich habe eine echte Kopfschmerzen Bindung meiner Artikel zu Pins auf einer Silverlight Bing Karte.Bing Karten Binding Problem

Ich habe den ganzen Tag damit verbracht, meine Sammlung sortiert zu bekommen, und jetzt können die Drucknadeln einfach nicht mehr angezeigt werden.

Die Elemente erscheinen, dort zu sein, als wenn Sie einen Haltepunkt in der letzten Zeile zu tun als je das Bild unten, alle 143 Artikel gibt es in _PushPins:

alt text

Jede Hilfe willkommen. Danke vielmals. Hier

ist der Code:

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

Andere Klasse:

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> 

Antwort

2

Sie versuchen, zu einem privaten Feld zu binden, _PushPins, statt das öffentliche Eigentum PushPins. Vergessen Sie nicht, INotifyPropertyChanged zu implementieren, wenn Sie die Sammlung nach dem Binden ändern.

+0

Danke für Ihre Antwort Martin. Ich habe meinen Code und mein Image auf das Problem geändert. Immer noch keine Freude. Brauche ich eine Art von Get-Set-Accessor für die öffentliche ObservableCollection PushPins? –

+1

Ja, Sie können nur an Eigenschaften binden, nicht an Felder. Außerdem verweist Ihr XAML immer noch auf _PushPins. – devdigital

+0

Ahh, die XAML verwenden, war ein Fehler beim Herumspielen. Schülerfehler. Ich bin nicht ganz sicher, was ich mit dem get/set Accessor dort mache, ich habe es bearbeitet, und natürlich noch keine Freude :(Ich bin sicher, es ist offensichtlich für einen Experten, was hier falsch ist :-) –

1

Ich würde zwei Dinge tun - erstens, implementiert INotifyPropertyChanged und haben Sie Ihre PushPins-Eigenschaft mit einem privaten Backing-Feld. Geben Sie im Getter einfach den Feldwert zurück, aktualisieren Sie im Feld den Feldwert, und rufen Sie das PropertyChanged-Ereignis auf.

Dann in Ihrer Schleife, anstatt die getItems-Methode (ich würde PascalCase für Methodennamen verwenden) erstellen eine lokale ObservableCollection, instanziieren Sie die PushPins-Sammlung und füllen Sie sie direkt.

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

Bestücken der SItem2 Location-Eigenschaft im SItem2 Konstruktor stattdessen die lat/long verwenden und wie Martin sagt, wenn Sie die Benutzeroberfläche aktualisieren möchten, wenn Sie den Wert eines SItem2 Instanz in der Sammlung zu ändern, dann implementieren INotifyPropertyChanged auf Eigenschaften von SItem2 auch.

+0

Vielen Dank für Ihre Hilfe bis jetzt. Ich habe den Code auf meinen aktuellen Stand aktualisiert. Ich bin mir nicht sicher, was ich mit der "Location = new GeoCoordinate (ev.Latitude, ev.Longitude)" machen soll, um die Location Items zu erstellen. Ich bin sicher, dass mein Mangel an Wissen hier auftaucht. –

+0

Sie setzen den Standortwert nirgends, in Ihrem SItem2-Konstruktor können Sie dies einstellen.Location = new Location (this.Latitude, this.Longitude); – devdigital

+0

Danke, ich werde das ausprobieren. –