Mvvm 在页面加载之前设置传递的参数
我已将xamrin.form.maps移动到MVVM,并已将我的xaml设置为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,它工作得很好,问题是在绑定
<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);
}
}