zzzz
zzzz

Reputation: 1

Xamarin google maps bindings:BindingPinsBehavior not showing Pins on map

I can interact with the map with the following functionality. setting the Zoom, current position and even showing polygons. Just can't get any pin to be displayed.

Am getting pin data to the MapView and as have tested it is visible in a

Have also added a click event on the map which can see the correct count of pins.

The issue is that non of the pins are visible. Have tried with the default pin and also a custom pin using .Icon

This is my MapViewModel.cs

using MapApp.Mobile.Core.Contracts.Services.General;
using MapApp.Mobile.Core.ViewModels.Base;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using MapApp.Mobile.Core.Services.Data;
using MapApp.Mobile.Core.Contracts.Services.Data;
using System.Collections.ObjectModel;
using Xamarin.Forms.GoogleMaps;
using MapApp.Mobile.Core.Models;

using Xamarin.Forms.GoogleMaps.Bindings;
using Xamarin.Forms;


using Plugin.Geolocator.Abstractions;

namespace MapApp.Mobile.Core.ViewModels
{
    public class MapViewModel : ViewModelBase
    {
        private readonly IZoneService _zoneService;
        private readonly IAddressService _addressService;

        //Expands to a region
        private MapSpan _visibleRegion;
        public MapSpan VisibleRegion
        {
            get => _visibleRegion;
            set
            {
                _visibleRegion = value;
                RaisePropertyChanged(() => VisibleRegion);
            }
        }

        //Map collection of pins
        private ObservableCollection<Pin> _pins;
        public ObservableCollection<Pin> Pins
        {
            get => _pins;
            set
            {
                _pins = value;
                RaisePropertyChanged(() => Pins);
            }
        }

        private ObservableCollection<Polygon> _nogoZones;
        public ObservableCollection<Polygon> NogoZones
        {
            get => _nogoZones;
            set {
                _nogoZones = value;
                RaisePropertyChanged(() => NogoZones);
            }
        
        }

        public MoveToRegionRequest MoveToRegionRequest { get; } = new MoveToRegionRequest();

        public MapViewModel(IConnectionService connectionService,
            INavigationService navigationService, IDialogService dialogService,
            IZoneService zoneService, IAddressService addressService)
            : base(connectionService, navigationService, dialogService)
        {


            _zoneService = zoneService;
            _addressService = addressService;
        }

        public Command<MapClickedEventArgs> MapClickedCommand =>
            new Command<MapClickedEventArgs>(args =>
            {
                Pins.Add(new Pin
                {
                    Label = $"Pin{Pins.Count}",
                    Position = args.Point
                });
            });


        //public override async Task InitializeAsync(object navigationData)
        public override async Task InitializeAsync(object navigationData)
        {
            Coordinates defaultCoordinates = _zoneService.GetAssignedLatitudeLongitude();

            //Sets the visible view of the maps - 0.25 miles around the centre of the coord point
            VisibleRegion = MapSpan.FromCenterAndRadius(
                new Xamarin.Forms.GoogleMaps.Position(defaultCoordinates.Latitude, defaultCoordinates.Longitude),
                Distance.FromMiles(0.25));

            MoveToRegionRequest.MoveToRegion(VisibleRegion);


            //Get near by address to current location
            var addresses = await _addressService.GetNearbyAddressesAsync(defaultCoordinates.Latitude, defaultCoordinates.Longitude);

            //Now populate on the map                
            _pins = new ObservableCollection<Pin>();
            foreach (Models.Address a in addresses)
            {

                Xamarin.Forms.GoogleMaps.Pin p = new Xamarin.Forms.GoogleMaps.Pin();
                p.Type = PinType.Generic;
                p.Address = a.Address1;
                p.Label = a.AddressDisplay;
                p.Position = new Xamarin.Forms.GoogleMaps.Position((double)a.Latitude, (double)a.Longitude);
                p.Icon = BitmapDescriptorFactory.FromBundle(a.AddressStatus.Icon);


                _pins.Add(p);

            }
            Pins = new ObservableCollection<Pin>(_pins);
            RaisePropertyChanged(() => Pins);


            var zones = _zoneService.GetZones();

            foreach (var zone in zones)
            {
                Polygon zonePolygon = new Polygon
                {
                    StrokeColor = Color.DarkRed,
                    FillColor = Color.FromRgba(255, 0, 0, 0.5f),
                    StrokeWidth = 3f,
                    Tag = zone.Name,
                };
                foreach (var coordinates in zone.Bounds)
                {
                    zonePolygon.Positions.Add(new Xamarin.Forms.GoogleMaps.Position(coordinates.Latitude, coordinates.Longitude));
                }
                _nogoZones.Add(zonePolygon);
            }
        }

    }
}

And this is the MapView.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MapApp.Mobile.Core.Views.MapView"
            xmlns:utility="clr-namespace:MapApp.Mobile.Core.Utility;assembly=MapApp.Mobile.Core"             
             utility:ViewModelLocator.AutoWireViewModel="True"             
             xmlns:maps="clr-namespace:Xamarin.Forms.GoogleMaps;assembly=Xamarin.Forms.GoogleMaps"
             xmlns:bindings="clr-namespace:Xamarin.Forms.GoogleMaps.Bindings;assembly=Xamarin.Forms.GoogleMaps.Bindings"
             Title="Map">
    
    <ContentPage.Content>
        <StackLayout>

            <Grid>
                <ListView VerticalOptions="FillAndExpand" Header="{Binding .}" Footer="{Binding .}" 
                  ItemsSource="{Binding Pins}" CachingStrategy="RecycleElement"
            SeparatorVisibility="Default"
            
            HasUnevenRows="True">
                    <ListView.HeaderTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="8*"></RowDefinition>
                                    <RowDefinition Height="2*"></RowDefinition>
                                </Grid.RowDefinitions>
                                <Image HeightRequest="200" Grid.Row="0" Source="carousel3.jpg" Aspect="AspectFill"></Image>
                                <StackLayout Grid.Row="1">
                                    <Label Text="OUR SELECTION OF PIES" Style="{StaticResource PageHeaderStyle}" HorizontalOptions="CenterAndExpand"></Label>
                                </StackLayout>
                            </Grid>
                        </DataTemplate>
                    </ListView.HeaderTemplate>
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <Grid Margin="5" BackgroundColor="White" RowSpacing="2" HeightRequest="60">
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*"></RowDefinition>
                                        <RowDefinition Height="*"></RowDefinition>
                                    </Grid.RowDefinitions>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="50"></ColumnDefinition>
                                        <ColumnDefinition Width="*"></ColumnDefinition>
                                        <ColumnDefinition Width="60"></ColumnDefinition>
                                    </Grid.ColumnDefinitions>
                                    <!--<Image Grid.Row="0" Grid.RowSpan="2" HeightRequest="80" WidthRequest="100" VerticalOptions="Start" Margin="2,2,1,2" Source="{Binding ImageUrl}"></Image>-->
                                    <StackLayout Grid.Row="0" Grid.Column="1">
                                        <Label  Text="{Binding Address}" Margin="3" Style="{StaticResource PieTileNameStyle}" LineBreakMode="WordWrap"></Label>
                                    </StackLayout>
                                    <!--<Label Grid.Row="0" Grid.Column="2"  Margin="3" Text="{Binding Price, Converter={StaticResource LocalCurrencyConverter}}" Style="{StaticResource PieTilePriceStyle}" HorizontalTextAlignment="End"></Label>-->
                                    <StackLayout Grid.Column="1" Grid.Row="1">
                                        <Label  Margin="3" Grid.ColumnSpan="2" Text="{Binding Label}" Style="{StaticResource PieTileDescriptionStyle}"></Label>
                                    </StackLayout>
                                </Grid>
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>

                </ListView>
            </Grid>


            <maps:Map VerticalOptions="FillAndExpand"
                      MyLocationEnabled="True"
                      MapType="Hybrid">
                <maps:Map.Behaviors>
                    <bindings:BindingVisibleRegionBehavior Value="{Binding VisbleRegion}"/>
                    <bindings:MoveToRegionBehavior Request="{Binding MoveToRegionRequest}"/>
                    <bindings:BindingPolygonsBehavior Value="{Binding NogoZones}"/>
                    <bindings:BindingPinsBehavior Value="{Binding Pins}" />
                    <bindings:MapClickedToCommandBehavior Command="{Binding MapClickedCommand}"/>
                </maps:Map.Behaviors>

            </maps:Map>


        </StackLayout>
    </ContentPage.Content>
</ContentPage>

Greatly appreciate any help or suggestions

Upvotes: 0

Views: 989

Answers (1)

Marc-Anthony
Marc-Anthony

Reputation: 102

You need to initialize the ObservableCollection<Pin> before you can add pins to it. Create a constructor and initialize ObservableCollection<Pin> then add the pins to that collection.

Upvotes: 1

Related Questions