【问题标题】:Setting passed parameter before page loads在页面加载之前设置传递的参数
【发布时间】:2020-04-13 19:56:19
【问题描述】:

我已将 xamrin.form.maps 移至 MVVM 并将我的 xaml 设置为

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

我的自定义地图类

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);
    }
}

【问题讨论】:

  • MyPosition 是否在其值更改时通知?你的 ViewModel 是什么样子的?

标签: mvvm xamarin.forms prism xamarin.forms.maps


【解决方案1】:

这与您的资源更新时间无关。

您将MapPosition 绑定到MyPosition,我猜这是一个属性。为了使 MVVM 工作,这个 MapPosition 必须通知它已经改变,通常这看起来像 (documentation of 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 中实现更改通知模式。

【讨论】:

  • 那行得通。我发誓我正在尝试或已经尝试过。我认为我的问题是我缺少 OnPropertyChanged();在 Get/Set 中,我按照您的建议设置了 myPosition 而不是 MyPosition。非常感谢!
  • 很高兴我能帮上忙 :)
猜你喜欢
  • 1970-01-01
  • 2018-06-07
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多