ReactiveUI谷歌地图

时间:2016-04-22 20:47:54

标签: xamarin.android reactiveui

问题:我的ViewModel中有一个IReactiveDerivedList<SensorViewModel>,我希望在观察之前订阅其中的更改,包括列表中已有的内容。然后将其输入GoogleMaps for 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)));
}

但我还需要跟踪从Circle返回的map.AddCircle,以便在对象消失时将其从地图中删除。处理此类案件的反应方式是什么?

1 个答案:

答案 0 :(得分:1)

我不知道这是否是最活跃的方式,但我发现似乎有用的东西:

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