MVVMКросс-связывание полей CodeBehind - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь привязать результат EventArgs события MapLongClicked к свойству «Location» в ViewModel в Xamarin Forms, используя пакет nuget GoogleMaps. Проблема в том, что я могу получить доступ только к тем EventArgs в XAML-коде позади. Поскольку я использую MVVMCross, я нашел что-то о привязке полей, но это не для кода позади. Мой MapPage выглядит сейчас так:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MapPage : MvxContentPage
{
    public MapPage()
    {
        InitializeComponent();

        map.UiSettings.ZoomControlsEnabled = false;

        map.MapLongClicked += (sender, e) =>
        {
            //((MapViewModel)map.BindingContext).Location = new Microsoft.Azure.Documents.Spatial.Point(e.Point.Longitude, e.Point.Latitude);
            var pin = new Pin
            {
                Type = PinType.SearchResult,
                Position = new Position(e.Point.Latitude, e.Point.Longitude),
                Label = string.Format(e.Point.Latitude.ToString("0.000") + " / " + e.Point.Longitude.ToString("0.000"))
            };
            map.Pins.Add(pin);
        };

    }
}

XAML:

<mvx:MvxContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:mvx="clr-namespace:MvvmCross.Forms.Views;assembly=MvvmCross.Forms"
    xmlns:maps="clr-namespace:Xamarin.Forms.GoogleMaps;assembly=Xamarin.Forms.GoogleMaps"
    xmlns:behaviors="clr-namespace:XamFormsMaps.Core.Behaviors;assembly=XamFormsMaps.Core"
    x:Class="XamFormsMaps.Core.Pages.MapPage">
    <ContentPage.Content>
        <StackLayout>
            <maps:Map 
               x:Name="map"
               WidthRequest="320" 
               HeightRequest="200"
               IsShowingUser="true"
               MapType="Hybrid">

                <maps:Map.Behaviors>
                    <behaviors:MapBehavior ItemsSource="{Binding Parkings}" />
                </maps:Map.Behaviors>
            </maps:Map>
        </StackLayout>
    </ContentPage.Content>
</mvx:MvxContentPage>

Я попробовал закомментированный вариант, но он дает мне ошибку приведения, поэтому у меня нет больше идей.

Кто-нибудь знает, как я могу отправить переменную из кода XAML в ViewModel?

1 Ответ

0 голосов
/ 16 сентября 2018

Это решило мою проблему:

((MapViewModel)map.BindingContext).Location = new Microsoft.Azure.Documents.Spatial.Point(e.Point.Longitude, e.Point.Latitude);
        var pin = new Pin

Убедитесь, что map.BindingContext - это MapViewModel во время выполнения.

...