使用MvvmCross在Activity中触发事件

时间:2013-07-26 14:40:02

标签: xamarin mvvmcross

我有一个MvxFragmentActivity,可以加载谷歌地图并在地图上放置标记。创建地图和标记的代码非常具有Droid特性,因此它位于Activity中。标记是基于ViewModel中的对象创建的,每个对象都包含纬度/经度坐标。只要我在Init方法中加载对象,这就可以正常工作。我已经将load对象方法移动到一个服务并在另一个线程上调用它。这样UI就是响应式的。但是,如何在加载完成后调用Activity中的方法?

以下是我在Activity中的当前代码(此代码不应更改,只是如何调用):

    private void InitMapFragment()
    {
        foreach (var item in viewModel.Items)
        {
            var icon = BitmapDescriptorFactory.FromResource(Resource.Drawable.place_img);
            var markerOptions = new MarkerOptions()
                .SetPosition(new LatLng(item.Latitude, item.Longitude))
                .InvokeIcon(icon)
                .SetSnippet(item.DistanceText)
                .SetTitle(item.Name);
            var marker = _map.AddMarker(markerOptions);
            _markerIds.Add(marker.Id, item.Id);
        }
   }

我的viewModel中的代码:

    private void BeginLoadItems()
    {
        _loadItemsService.Load();
    }

    // This is triggered by a message
    private void OnLoadItemsComplete(LoadCompleteMessage message)
    {
        Items = message.Items;
    }

我服务中的代码:

    public void Load()
    {
        ThreadPool.QueueUserWorkItem(state =>
            {
                var results = _repository.Retrieve();
                _messenger.Publish(new LoadCompleteMessage(this, results));
            });
    }

1 个答案:

答案 0 :(得分:1)

您在设置时已触发事件:

    Items = message.Items;

这会触发PropertyChanged,其属性名称为“Items”

有关地图绑定的更多信息,请参阅Using MvvmCross how can I bind a list of annotations to a MapView? - 尽管使用Droid,您还需要使用标记而不是注释。