0

我已将 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); }
}

从第一页开始,我将 lat lng 发送到地图。如果我在我的 VM 的构造函数中设置 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);
    }
}
4

1 回答 1

1

这与您的属性更新的时间无关。

你绑定MapPositionMyPosition,我猜这是一个属性。为了使 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,允许 setter 提升PropertyChanged并因此视图更新其状态,但您直接设置支持字段myPosition。在这种情况下,setter 永远不会被调用,视图也没有机会知道 的值MyPosition已更改,因此不会更新其状态。

如果您的 setter 实现了上面显示的模式,只需更改

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

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

它应该可以工作。否则,也可以在 中实现更改通知模式MyPosition

于 2020-04-14T04:10:06.760 回答