Mvvm 在页面加载之前设置传递的参数

Mvvm 在页面加载之前设置传递的参数,mvvm,xamarin.forms,prism,xamarin.forms.maps,Mvvm,Xamarin.forms,Prism,Xamarin.forms.maps,我已将xamrin.form.maps移动到MVVM,并已将我的xaml设置为 <viewModels:CustomMap IsShowingUser="True" x:Name="customMap" MapPosition="{Binding MyPosition}" CustomPins="{Binding PinCollection}" /> 从第一页开始,我将向地图发送lat lng。如果我在我的VM中的构造函数中设置MapPosition,它工作得很好,问题是在绑定

我已将xamrin.form.maps移动到MVVM,并已将我的xaml设置为

<viewModels:CustomMap IsShowingUser="True"  x:Name="customMap"  MapPosition="{Binding MyPosition}" CustomPins="{Binding PinCollection}" />
从第一页开始,我将向地图发送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);
    }
}
public override async void OnNavigatedTo(INavigationParameters)
{
if(parameters.ContainsKey(“mapLocation”))
{
var mapLocation=parameters.GetValue(“mapLocation”);
myPosition=新位置(mapLocation.Lat、mapLocation.Lng);
}
}

这与更新属性的时间无关

您将
MapPosition
绑定到
MyPosition
,我猜这是一个属性。要让MVVM工作,这个
MapPosition
必须通知它已更改,通常看起来像(the)

公共地图位置MyPosition
{
get=>myPosition;
设置
{
如果(myPosition==值)
{
返回;
}
我的位置=值;
OnPropertyChanged();
}
}
私有void OnPropertyChanged([CallerMemberName]字符串memberName=null)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
您的视图确实知道,如果绑定对象实现了
INotifyPropertyChanged
,它必须订阅
PropertyChanged
,并且如果引发此事件,它可以相应地更新其状态

为什么在你的情况下不起作用? 您正在设置
MyPosition
,允许setter提升
PropertyChanged
,从而视图更新其状态,但您正在直接设置backing字段
MyPosition
。在这种情况下,永远不会调用setter,并且视图没有机会知道
MyPosition
的值已更改,因此不会更新其状态

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

myPosition=新位置(mapLocation.Lat、mapLocation.Lng);

MyPosition=新位置(mapLocation.Lat、mapLocation.Lng);

它应该会起作用。否则,也在
MyPosition
中实现更改通知模式。

是否在其值更改时通知
MyPosition
?你的ViewModel看起来像什么?这很有效。我发誓我正在尝试或者已经尝试过了。我想我的问题是我缺少了一个属性changed();在Get/Set中,我设置了myPosition,而不是您建议的myPosition。非常感谢你!很高兴我能帮忙:)
public override async void OnNavigatedTo(INavigationParameters parameters)
{
    if (parameters.ContainsKey("mapLocation"))
    {
        var mapLocation = parameters.GetValue<MapLocation>("mapLocation");
        myPosition = new Position(mapLocation.Lat, mapLocation.Lng);
    }
}