Having Issue on Implementing MVVM with ArcGIS Runtime Local Server

531
1
11-21-2018 12:17 PM
Labels (1)
BehrouzHosseini
Occasional Contributor

I am trying to setup a ESRI Local Server for displaying .mpk. I have a Model like

 public class Model
    {

        private string basemapLayerUri = "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer";
        private string mapPackage = "D:\\App\\Data\\Canada.mpk";
        public Model()  { }


        public string BasemapLayerUri
        {
            get {return this.basemapLayerUri; }
            set
            {
                if (value != this.basemapLayerUri)
                {
                    this.basemapLayerUri = value;
                }
            }
        }
        public string MapPackage
        {
            get { return this.mapPackage; }
            set
            {
                if (value != this.mapPackage)
                {
                    this.mapPackage = value;
                }
            }
        }
    }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

in ViewModel.cs Class I have

public class ViewModel : INotifyPropertyChanged { public Model myModel { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    public ViewModel()
    {
        myModel = new Model();
        this.CreateLocalServiceAndDynamicLayer();
    }

    public string BasemapUri
    {
        get { return myModel.BasemapLayerUri;  }
        set 
        { 
            this.myModel.BasemapLayerUri = value;
            OnPropertyChanged("BasemapUri");
        }
    }

    public async void CreateLocalServiceAndDynamicLayer()
    {
        LocalMapService localMapService = new LocalMapService(this.MAPKMap);
        await localMapService.StartAsync();

        ArcGISDynamicMapServiceLayer arcGISDynamicMapServiceLayer = new ArcGISDynamicMapServiceLayer()
        {
            ID = "mpklayer",
            ServiceUri = localMapService.UrlMapService,
        };

        //myModel.Map.Layers.Add(arcGISDynamicMapServiceLayer);
    }

    public string MAPKMap
    {
        get { return myModel.MapPackage; }
        set
        {
            this.myModel.MapPackage = value;
            OnPropertyChanged("MAPKMap");
        }
    }

    protected void OnPropertyChanged([CallerMemberName] string member = "")
    {
        var eventHandler = PropertyChanged;
        if (eventHandler != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(member));
        }
    }
}‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

As you can see I am trying to implement the local server and dynamic layer in ViewModel.cs like

public async void CreateLocalServiceAndDynamicLayer()
{
    LocalMapService localMapService = new LocalMapService(this.MAPKMap);
    await localMapService.StartAsync();

    ArcGISDynamicMapServiceLayer arcGISDynamicMapServiceLayer = new ArcGISDynamicMapServiceLayer()
    {
        ID = "mpklayer",
        ServiceUri = localMapService.UrlMapService,
    };

    myModel.Map.Layers.Add(arcGISDynamicMapServiceLayer);
}‍‍‍‍‍‍‍‍‍‍‍‍‍

but I do not know how to bind this service to the Mode ? I tried

myModel.Map.Layers.Add(arcGISDynamicMapServiceLayer);

but as you know the myModel doesn't have any Map object. Can you please let me know how to fix this?

0 Kudos
1 Reply
PrashantKirpan
Occasional Contributor

Hi, 

Create Property in viewmodel.cs and bind it to map object in XAMl. After that you can pass Map object to your model class. Create Map object in viewmodel constructor.

Sample code:

 public Map Map { get; set; }
 public ViewModel()
    {
        Map = new Map(new Basemap(basemapLyrs));
        myModel = new Model(Map);
        this.CreateLocalServiceAndDynamicLayer();
    }

 <esri:MapView x:Name="AppMapView" Map="{Binding Map}"  

Regards,

Prashant 

0 Kudos