1

Google マップを読み込み、マップ上にマーカーを配置する MvxFragmentActivity があります。マップとマーカーを作成するコードは Droid 固有のものであるため、Activity に含まれています。マーカーは、それぞれ緯度/経度座標を含む ViewModel 内のオブジェクトに基づいて作成されます。Init メソッドにオブジェクトをロードしている限り、これは問題なく機能しました。その後、load objects メソッドをサービスに移動し、別のスレッドで呼び出しました。このように、UI はレスポンシブです。ただし、ロードが完了したときにアクティビティでメソッドを呼び出すにはどうすればよいですか?

アクティビティ内の現在のコードは次のとおりです (このコードは、呼び出し方だけを変更する必要はありません)。

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

私のビューモデルのコード:

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

1 に答える 1

1

次のように設定すると、すでにイベントがトリガーされています。

    Items = message.Items;

これにより、プロパティ名が「Items」の PropertyChanged がトリガーされます。

マップ バインディングの詳細については、「MvvmCross を使用して、注釈のリストを MapView にバインドするにはどうすればよいですか?」を参照してください。- ただし、Droid では注釈の代わりにマーカーを使用する必要があります。

于 2013-07-26T18:42:46.067 に答える