Установка переданного параметра перед загрузкой страницы - PullRequest
0 голосов
/ 13 апреля 2020

Я переместил xamrin.form.maps в MVVM и установил для моего xaml значение

<viewModels:CustomMap IsShowingUser="True"  x:Name="customMap"  MapPosition="{Binding MyPosition}" CustomPins="{Binding PinCollection}" />

Мой класс customMap

public static readonly BindableProperty MapPositionProperty = BindableProperty.Create(
            nameof(MapPosition),
            typeof(Position),
            typeof(CustomMap),
            new Position(0, 0),
            propertyChanged: (b, o, n) =>
            {
                Console.WriteLine("here");
                ((CustomMap)b).MoveToRegion(MapSpan.FromCenterAndRadius(
                            (Position)n, Distance.FromMiles(.05)));

            });

public Position MapPosition
{
    get { return (Position)GetValue(MapPositionProperty); }
    set { SetValue(MapPositionProperty, value); }
}

На первой странице я отправляю широту на карту. Если я установлю MapPosition в моем конструкторе на моей виртуальной машине, он будет работать идеально, проблема заключается в том, чтобы получить значение lat и lng для моего конструктора до того, как все будет связано, в противном случае он не будет обновляться.

В модели представления, которую я собираю параметры для установки позиции.

public override async void OnNavigatedTo(INavigationParameters parameters)
{
    if (parameters.ContainsKey("mapLocation"))
    {
        var mapLocation = parameters.GetValue<MapLocation>("mapLocation");
        myPosition = new Position(mapLocation.Lat, mapLocation.Lng);
    }
}

1 Ответ

1 голос
/ 14 апреля 2020

Это не имеет никакого отношения ко времени обновления вашего свойства.

Вы связали MapPosition с MyPosition, что, я думаю, является свойством. Чтобы MVVM работал, этот MapPosition должен уведомить, что он изменился, обычно это выглядит примерно так (документация INotifyPropertyChanged.PropertyChanged)

public MapLocation MyPosition
{
    get => myPosition;

    set 
    {
        if(myPosition == value)
        {
            return;
        }

        myPosition = value;
        OnPropertyChanged();
    }
}

private void OnPropertyChanged([CallerMemberName] string memberName = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

Ваше мнение знает что если связанные объекты реализуют INotifyPropertyChanged, он должен подписаться на PropertyChanged и может соответствующим образом обновить свое состояние, если это событие вызвано.

Теперь, почему это не работает в вашем случае?

Вы не настраиваете MyPosition, позволяя установщику поднять PropertyChanged и, таким образом, представление обновляет свое состояние, но вы непосредственно устанавливаете поле поддержки myPosition. В этом случае установщик никогда не вызывается, и у представления нет шансов узнать, что значение MyPosition изменилось, поэтому оно не будет обновлять свое состояние.

Если ваш установщик реализует шаблон, показанный выше, просто измените

myPosition = new Position(mapLocation.Lat, mapLocation.Lng);

на

MyPosition = new Position(mapLocation.Lat, mapLocation.Lng);

, и оно должно работать. В противном случае используйте шаблон уведомления об изменениях и в MyPosition.

...