Xamarin.android 反应用户界面谷歌地图

Xamarin.android 反应用户界面谷歌地图,xamarin.android,reactiveui,Xamarin.android,Reactiveui,问题:我的ViewModel中有一个IReactiveDerivedList,我想在观察之前订阅其中的更改,包括列表中已有的内容。然后,这些信息被输入谷歌地图,用于Xamarin Android 当我添加一些内容时,这似乎起作用: public void OnMapReady(GoogleMap map) { _itemsAdded = this.ViewModel.Sensors.ItemsAdded .ObserveOn(RxApp.MainThreadSch

问题:我的ViewModel中有一个
IReactiveDerivedList
,我想在观察之前订阅其中的更改,包括列表中已有的内容。然后,这些信息被输入谷歌地图,用于Xamarin Android

当我添加一些内容时,这似乎起作用:

public void OnMapReady(GoogleMap map)
{
    _itemsAdded = this.ViewModel.Sensors.ItemsAdded
            .ObserveOn(RxApp.MainThreadScheduler)
            .Select(s => new CircleOptions()
                .InvokeCenter(new LatLng(s.Latitude, s.Longitude))
                .InvokeRadius(1000)
                .InvokeFillColor(Color.Blue.ToArgb())
                .InvokeStrokeColor(Color.Red.ToArgb()))
            .Subscribe(
                Observer.Create<CircleOptions>(options => map.AddCircle(options)));
}
public void OnMapReady(谷歌地图)
{
_itemsAdded=this.ViewModel.Sensors.itemsAdded
.ObserveOn(RxApp.MainThreadScheduler)
.Select(s=>newcircleOptions()
.InvokeCenter(新纬度、经度)
.InvokeRadius(1000)
.InvokeFillColor(Color.Blue.ToArgb())
.InvokeStrokeColor(Color.Red.ToArgb())
.订阅(
创建(选项=>map.AddCircle(选项));
}

但是我还需要跟踪从
map.AddCircle
返回的
圆圈,以便在对象离开时将其从地图中删除。处理这种情况的反应式方法是什么?

我不知道这是否是最反应式的方法,但我找到了一些似乎有效的方法:

    private IDisposable _itemsAdded;
    private IDisposable _itemsRemoved;

    private readonly Dictionary<string, Circle> _circleMap = new Dictionary<string, Circle>();

    public void OnMapReady(GoogleMap map)
    {
        _circleMap.Clear();

        _itemsAdded = this.ViewModel.Sensors.ItemsAdded
            .StartWith(this.ViewModel.Sensors)
            .Subscribe(s =>
            {
                var options = new CircleOptions()
                    .InvokeCenter(new LatLng(s.Latitude, s.Longitude))
                    .InvokeRadius(1000)
                    .InvokeFillColor(Color.Blue.ToArgb())
                    .InvokeStrokeColor(Color.Red.ToArgb());

                var circle = map.AddCircle(options);
                this._circleMap.Add(s.Id, circle);
            });

        _itemsRemoved = this.ViewModel.Sensors.ItemsRemoved
            .Subscribe(s =>
            {
                Circle circle = null;
                if (this._circleMap.TryGetValue(s.Id, out circle))
                {
                    this._circleMap.Remove(s.Id);
                    circle.Remove();
                }
            });
    }
private IDisposable\u itemsAdded;
私有IDisposable_项目已删除;
专用只读词典_circleMap=new Dictionary();
已于4月1日公开作废(谷歌地图)
{
_圈映射清除();
_itemsAdded=this.ViewModel.Sensors.itemsAdded
.StartWith(this.ViewModel.Sensors)
。订阅(s=>
{
var options=new CircleOptions()
.InvokeCenter(新纬度、经度)
.InvokeRadius(1000)
.InvokeFillColor(Color.Blue.ToArgb())
.InvokeStrokeColor(Color.Red.ToArgb());
var circle=map.AddCircle(选项);
此._circleMap.Add(s.Id,圆圈);
});
_itemsRemoved=this.ViewModel.Sensors.itemsRemoved
。订阅(s=>
{
圆圈=空;
if(此圆映射TryGetValue(s.Id,外圆))
{
本图为移除(s.Id)的圆形地图;
圈。删除();
}
});
}

这看起来不错。你也可以考虑使用<代码> CypTeItApabdie<代码>来存储你的<代码> IDsAsabess 在一个地方,并用<代码>直接替换<代码> VisualMase<代码>。(或者当它被替换时)。我将切换到一个
复合可编程文件
。上面的代码在视图中(Android活动)如果你在Android项目中引用了ReactiveUI,那么这应该是可行的,因为,
WhenAny
家族是泛型T上的扩展方法。我提到的关于VM的东西也被描述了。我明白,我只是不确定上面的例子应该如何工作。C你能告诉我我会用它来改进上面的代码吗?