2016-05-20 8 views
0

Ich versuche, einen benutzerdefinierten Renderer für eine Xamarin-Map auf UWP zu schreiben, und ein Sammlungsänderungsereignis in der PCL löst nicht das entsprechende Ereignis im benutzerdefinierten UWP-Renderer aus. Es funktioniert gut auf iOS und Android.Warum feuert mein Event nicht in Xamarin UWP Map CustomRenderer?

Mit dem folgenden Code wird das Ereignis ItemsCollectionChanged niemals im CustomMapRenderer aufgerufen, auch nicht durch den OnItemsSourcePropertyChanged, der alle 5 Sekunden aufgerufen wird.

public class CustomMap : Map 
    { 

    #region <<Events>> 

    public event EventHandler ItemsCollectionChanged; 

    #endregion 

      private static void OnItemsSourcePropertyChanged(BindableObject bindable, object oldValue, object newValue) 
      { 
       var map = bindable as CustomMap; 

       if (map == null) 
         return; 

       map.ItemsSource.CollectionChanged += (s, e) => 
       { 
         SetPin(bindable); 
         if (map.ItemsCollectionChanged != null) 
         { 
           map.ItemsCollectionChanged(bindable, new EventArgs()); 
         } 
       }; 
      } 

    } 

    [assembly: ExportRenderer(typeof(CustomMap), typeof(CustomMapRenderer))] 
Namespace MyNamespace.Renderers 
{ 
    public class CustomMapRenderer : MapRenderer 
{ 
    MapControl _nativeMap; 


    protected override void OnElementChanged(ElementChangedEventArgs<Map> e) 
    { 
     base.OnElementChanged(e); 

     if (e.OldElement != null) 
     { 
      _nativeMap.MapElementClick -= OnMapElementClick; 
      _nativeMap.Children.Clear(); 
      _nativeMap = null; 
     } 

     if (e.NewElement != null) 
     { 
      var formsMap = (CustomMap)e.NewElement; 
      formsMap.ItemsCollectionChanged += ItemsCollectionChanged; 

      _pinClickedCommand = formsMap.PinClickedCommand; 
      _routeCoordinates = formsMap.ItemsSource; 
      _nativeMap = Control as MapControl; 
      _nativeMap.Children.Clear(); 
      _nativeMap.MapElementClick += OnMapElementClick; 
      var snPosition = new BasicGeoposition { Latitude = 45, Longitude = -88 }; 
      Geopoint snPoint = new Geopoint(snPosition); 

      var mapIcon = new MapIcon(); 
      if (mapIcon != null) 
      { 
       _nativeMap.MapElements.Remove(mapIcon); 
      } 

      mapIcon.CollisionBehaviorDesired = MapElementCollisionBehavior.RemainVisible; 
      mapIcon.Location = snPoint; 
      mapIcon.NormalizedAnchorPoint = new Windows.Foundation.Point(0.5, 1.0); 
      _nativeMap.MapElements.Add(mapIcon); 
      _nativeMap.Center = snPoint; 
     } 

    } 


    void ItemsCollectionChanged(object sender, EventArgs e) 
    { 
     ; 
    } 
    } 
} 

Antwort

0

benutzte ich ein Singleton die beobachtbare Sammlung zu bekommen, die ich brauchte

Verwandte Themen