我有一个使用Xamarin.Essentials‘Xamarin.Maps的Xamarin项目。我有一个包含实体的IObservableCollection,我在XAML视图/页面中绑定到了地图上,但我也想手动地向该地图添加一个不在集合中的Pin。可以这样做吗?或者我应该放弃XAML绑定,手动处理Map.Pins吗?
MyPage.xaml
...
<maps:Map x:Name="MyMap" FlexLayout.Grow="1" ItemsSource="{Binding Churrerxs}">
<maps:Map.ItemTemplate>
<DataTemplate>
<maps:Pin x:DataType="model:MyModel" Position="{Binding PositionAttr}" Label="{Binding NameAttr}" />
</DataTemplate>
</maps:Map.ItemTemplate>
</maps:Map>
...我尝试在MyMap的定义中添加以下内容,但很明显,它不起作用:
<maps:Map.Pins>
<maps:Pin Position="{Binding MyPosition}" Label="MyPin" />
</maps:Map.Pins>我还尝试在页面的构造函数上创建一个Pin,并添加一个处理程序,当MyPosition发生如下变化时执行该处理程序:
if(_viewModel.MyPosition != null)
{
MyPin.Position = _viewModel.MyPosition;
if (!MyMap.Pins.Contains(MyPin))
{
MyMap.Pins.Add(MyPin);
}
}但是,由于Pins已经被XAML中的ItemTemplate操作,我已经陷入了手动添加引脚的竞争状态,但很快它就被删除了。
所以,我在努力想办法最好地处理这件事。我希望Map可以有多个Pins数组,所以我们可以为不同的集合使用绑定,但情况似乎并非如此。我在想:( a)我应该手动处理这个集合,或者( b)我应该通过绘制一个独立于Pins数组的圆或其他图形来显示MyPosition,而不是Pin。但是,如果有人知道处理这类场景的适当模式,我会给出建议。
发布于 2022-06-15 16:33:18
实际上,最简单的解决方案是在视图/页面中定义一个readonly Circle MyCircle,在它的构造函数中填充一个new Circle { Center = new Position(), Radius = Distance.FromMeters(10) },然后在它的构造函数中填充一个new Circle { Center = new Position(), Radius = Distance.FromMeters(10) },然后在它发生更改时简单地更新它的位置(注意:我只在实际获得了一个位置之后才将它添加到地图中,否则就不可能绘制)。
if(_viewModel.MyPosition != null)
{
MyCircle.Center = _viewModel.MyPosition;
if (!MyMap.MapElements.Contains(MyCircle))
{
MyMap.MapElements.Add(MyCircle);
}
}这是留给读者的一个练习,如果需要的话,如何处理输入(我不需要与圆圈交互,只需显示)。
https://stackoverflow.com/questions/72634876
复制相似问题