2013-09-02 8 views
6

Mam kontroli mapa z MapsItemControl w nim:„Rzeczy musi być pusty przed użyciem przedmioty Source” podczas aktualizowania 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> 

ja zapełnić MapItemsControl w kodzie następujący sposób:

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

Działa to poprawnie przy dodawaniu elementów do mapy po raz pierwszy. Ale jeśli chcę zaktualizować go z nową kolekcją poz soruce, pojawia się następujący błąd w itemCollection.ItemsSource = myItemCollection; line:

Items must be empty before using Items Source

Tak, próbowałem przez dodanie odpowiedniego wiersza do mojego kodu, w celu usunięcia pozycji przed ustawieniem ponownie źródło, ale bez powodzenia:

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

teraz mogę folowing wyjątek w linii itemCollection.Items.Clear();:

Collection is in non writeable mode

Jak mogę zaktualizować elementy w MapItemsControl?

+0

Czy dodawanie elementów ręcznie w pewnym momencie? Używając 'itemCollection.Add (...)'? –

+0

@KooKiz nie, nie jestem. – anderZubi

Odpowiedz

-1

Urmm .. Jak o

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

Zakładając jesteś nadal korzystać z tego samego myItemCollection posiadać aktualną informację (jeśli binging źródło, to prawdopodobnie powinien być przypadek), a następnie nie powinno się ponownie wiązać. Zamiast tego należy rzucać zdarzenia PropertyChanged, aby komponent wiedział, aby zaktualizować bieżącą zawartość źródła. Zobacz Binding Sources tutorial i How to: Implement Property Change Notification firmy Microsoft, aby uzyskać więcej informacji.

+0

Niestety wydaje się, że wiązań nie można używać z MaptItemsControl.ItemsSource. Zastosowanie wiązania znacznie ułatwiłoby osiągnięcie mojego celu. Jednak radzenie sobie z mapami w WP8 wydaje się trudniejsze niż w przypadku WP7. – anderZubi

+0

Strona MapItemsControl (http://msdn.microsoft.com/en-us/library/jj620947.aspx) służy do wiązania danych. Robi to jako klasa potomna ItemsControl (http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemssource.aspx). – aring

+1

To jest dla Bing Maps w aplikacji Windows Store. Współpracował również z Bing Maps w WP7, ale nie z MapItemsControl z zestawu Windows Phone Toolkit i Nokia Maps w pakiecie WP8 – anderZubi

0

Spróbuj użyć właściwości DataContext. A afaik nie musisz pisać Clear podczas korzystania z niego. Po prostu spróbuj tego:

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

itemCollection nie ma właściwości DataContext. – anderZubi

+0

Więc co masz zamiar napisać 'itemCollection.ItemsSource = null; itemCollection.ItemsSource = myItemCollection; '? Również: http: // stackoverflow.com/questions/14525618/phone-maps-items-collection-must-be-empty-before-using-itemssource –

+2

Otrzymuję ten sam błąd: * Przedmioty muszą być puste przed użyciem Items Source * – anderZubi

2

Wygląda pozycji zostanie zablokowana, jeśli wiąże się to z ItemsSource ... ale jeśli dodać każdą pozycję z Item.Add (pozycja), to działa dobrze. Więc co skończyło się robi było to:

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

Nadzieja to pomaga :)

+1

To działało jak urok dla mnie ! Jedyny problem, jaki widzę teraz, to usunięcie i ponowne dodanie pinezek, mają one tendencję do wizualnego "przeskakiwania" o kilka pikseli, kiedy po raz pierwszy się pojawiają. –

Powiązane problemy