2013-09-02 4 views
6

Ich habe eine Karte Kontrolle mit MapsItemControl darin:„Die Artikel müssen leer sein, bevor Artikel Quelle“ beim Aktualisieren MapItemsControl.ItemsSource

<maps:Map x:Name="MyMap"> 
    <maptk:MapExtensions.Children> 
     <maptk:MapItemsControl> 
      <maptk:MapItemsControl.ItemTemplate> 
       <DataTemplate> 
        . . . 
       </DataTemplate> 
      </maptk:MapItemsControl.ItemTemplate> 
     </maptk:MapItemsControl> 
    </maptk:MapExtensions.Children> 
</maps:Map> 

ich bevölkern die MapItemsControl im Code die folgende Art und Weise:

var itemCollection = MapExtensions.GetChildren((Map)MyMap).OfType<MapItemsControl>().FirstOrDefault(); 
itemCollection.ItemsSource = myItemCollection; 

Dies funktioniert ordnungsgemäß, wenn Elemente zum ersten Mal zur Karte hinzugefügt werden. Aber wenn ich es mit einer neuen soruce Artikel Sammlung aktualisieren mag, erhalte ich die folgende Fehlermeldung in itemCollection.ItemsSource = myItemCollection; Zeile:

Items must be empty before using Items Source

So habe ich versucht, eine Linie zu meinem Code hinzufügen, um Elemente zu entfernen, bevor Sie die Quelle wieder, ohne Erfolg:

var itemCollection = MapExtensions.GetChildren((Map)MyMap).OfType<MapItemsControl>().FirstOrDefault(); 
itemCollection.Items.Clear(); 
itemCollection.ItemsSource = myItemCollection; 

Jetzt erhalte ich die folowing Ausnahme in Zeile itemCollection.Items.Clear();:

Collection is in non writeable mode

Wie kann ich die Elemente in denaktualisieren?

+0

hilft Ihnen, Elemente manuell an einem gewissen Punkt hinzufügen? Mit 'itemCollection.Add (...)'? –

+0

@KooKiz nein, bin ich nicht. – anderZubi

Antwort

-1

Urmm .. Wie wäre es

itemCollection.Items = itemCollection.Items.Clear(); 
0

Angenommen Sie haben die gleiche myItemCollection zu verwenden sind weiterhin Ihre aktuelle Informationen zu halten (wenn Sie eine Quelle sind binging, sollte dies wahrscheinlich der Fall sein wird), können Sie dann sollte nicht neu binden müssen. Stattdessen müssen Sie PropertyChanged-Ereignisse auslösen, damit die Komponente den aktuellen Inhalt der Quelle aktualisieren kann. Weitere Informationen finden Sie unter Binding Sources tutorial und How to: Implement Property Change Notification von Microsoft.

+0

Leider scheint es, dass Bindungen mit MapTtemsControl.ItemsSource nicht verwendet werden können. Die Verwendung der Bindung würde es viel einfacher machen, mein Ziel zu erreichen. Der Umgang mit Karten in WP8 scheint jedoch schwieriger als mit WP7. – anderZubi

+0

Gemäß der MapItemsControl (http://msdn.microsoft.com/en-us/library/jj620947.aspx) Seite, ist es für die Datenbindung. Es tut dies als eine Kindklasse von ItemsControl (http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemssource.aspx). – aring

+1

Das ist für Bing Maps in der Windows Store App. Es funktionierte auch mit Bing Maps in WP7, aber nicht mit dem MapItemsControl von Windows Phone Toolkit und Nokia Maps in WP8 – anderZubi

0

Versuchen Sie, DataContext Eigenschaft zu verwenden. Und afaik müssen Sie nicht Clear schreiben, während Sie es verwenden. Ganz einfach versuchen:

var itemCollection = MapExtensions.GetChildren((Map)MyMap).OfType<MapItemsControl>().FirstOrDefault(); 
itemCollection.DataContext = myItemCollection; 
+2

itemCollection hat keine DataContext-Eigenschaft. – anderZubi

+0

Also, was ist zu schreiben? ItemCollection.ItemsSource = null; itemCollection.ItemsSource = myItemCollection; '? Außerdem: http: // stackoverflow.com/questions/14525618/phone-maps-items-collection-muss-sein-leer-vor-using-itemssource –

+2

Ich bekomme den gleichen Fehler: * Items müssen leer sein vor der Verwendung von Items Quelle * – anderZubi

2

Es scheint, wie Artikel wird gesperrt, wenn Sie es mit Itemssource binden ... aber wenn Sie jedes Element mit Item.Add (Artikel) hinzufügen, es funktioniert gut. Also, was ich am Ende tun war:

var itemCollection = MapExtensions.GetChildren((Map)MyMap) 
            .OfType<MapItemsControl>().FirstOrDefault(); 
if(itemCollection != null && itemCollection.Items.Count >0) 
{ 
    itemCollection.Items.Clear(); 
} 
foreach(var item in YourPushpinCollection) 
{ 
    itemCollection.Items.Add(item); 
} 

Hope this Sind :)

+1

Dies funktioniert wie ein Charme für mich ! Das einzige Problem, das ich jetzt sehe, ist beim Entfernen und erneuten Hinzufügen von Pins, sie neigen dazu, optisch einige Pixel zu "springen", wenn sie zum ersten Mal erscheinen. –

Verwandte Themen