private async Task CreateToc()
		{
			FeatureLayerInfoItems.Clear();
			if (CurrentEsriMapView == null) return;

			foreach (var layer in CurrentEsriMapView.Map.Layers)
			{
				if (!(layer is FeatureLayer)) continue;

				var featureLayer = layer as FeatureLayer;
				long edits = 0;
				FeatureServiceLayerInfo serviceInfo = null;
				if (featureLayer.FeatureTable is GeodatabaseFeatureTable)
				{
					var table = featureLayer.FeatureTable as GeodatabaseFeatureTable;
					if (table.HasEdits)
					{
						edits = table.AddedFeaturesCount + table.DeletedFeaturesCount + table.UpdatedFeaturesCount;
					}

					serviceInfo = table.ServiceInfo;
				}

				if (featureLayer.FeatureTable is ServiceFeatureTable) //online
				{
					var table = featureLayer.FeatureTable as ServiceFeatureTable;
					if (table.HasEdits)
					{
						edits = table.AddedFeaturesCount + table.DeletedFeaturesCount + table.UpdatedFeaturesCount;
					}

					serviceInfo = table.ServiceInfo;
				}


				bool isEditable = false;
				bool isSyncable = false;
				foreach (var capability in serviceInfo.Capabilities)
				{
					if (capability == "Editing")
					{
						isEditable = true;
					}
					if (capability == "Sync")
					{
						isSyncable = true;
					}
				}

				if (isEditable)
				{
					// var test = featureLayer.FeatureTable.ServiceInfo.DrawingInfo.Renderer as SimpleRenderer;
					// UniqueValueInfoCollection uniqueValueInfoCollection = test.;

					var legendInfosList = new List<LegendInfo>();

					if (serviceInfo.DrawingInfo.Renderer is SimpleRenderer)
					{
						var renderer =
							serviceInfo.DrawingInfo.Renderer as SimpleRenderer;
						var imageSource = await renderer.Symbol.CreateSwatchAsync();
						var legendInfo = new LegendInfo(renderer.Label, imageSource, renderer.Symbol, CreateNewFeatureCommand);
						legendInfosList.Add(legendInfo);
					}
					else if (serviceInfo.DrawingInfo.Renderer is UniqueValueRenderer)
					{
						var renderer = serviceInfo.DrawingInfo.Renderer as UniqueValueRenderer;
						foreach (var info in renderer.Infos)
						{
							var imageSource = await info.Symbol.CreateSwatchAsync();
							legendInfosList.Add(new LegendInfo(info.Label, imageSource, info.Symbol, CreateNewFeatureCommand));
						}
					}
					else if (serviceInfo.DrawingInfo.Renderer is ClassBreaksRenderer)
					{
						var renderer = serviceInfo.DrawingInfo.Renderer as ClassBreaksRenderer;

						foreach (var info in renderer.Infos)
						{
							var imageSource = await info.Symbol.CreateSwatchAsync();
							legendInfosList.Add(new LegendInfo(info.Label, imageSource, info.Symbol, CreateNewFeatureCommand));
						}
					}

					var featureLayerEditInfoItem = new FeatureLayerInfo(featureLayer, isEditable, isSyncable, edits, legendInfosList);
					FeatureLayerInfoItems.Add(featureLayerEditInfoItem);
				}
			}
		}
		private void SetLegendInfosCheckState(LegendInfo legendInfo)
		{
			foreach (var featureLayerInfoItem in FeatureLayerInfoItems)
			{
				foreach (var info in featureLayerInfoItem.LegendInfos.Where(info => !info.Equals(legendInfo)))
				{
					info.IsChecked = false;
				}
			}
		}
		private async Task CreateNewFeature(FeatureLayerInfo featureLayerInfo, LegendInfo legendInfo)
		{
			if (CurrentEsriMapView.Editor.IsActive)
			{
				CurrentEsriMapView.Editor.Cancel.Execute(null);
			}
			Graphic graphic = null;

			switch (featureLayerInfo.FeatureLayer.FeatureTable.GeometryType)
			{
				case GeometryType.Unknown:
					break;
				case GeometryType.Point:
					graphic = await CreateGraphicAsync(legendInfo.EsriSymbol, DrawShape.Point);
					break;
				case GeometryType.Polyline:
					graphic = await CreateGraphicAsync(legendInfo.EsriSymbol, DrawShape.Polyline);
					break;
				case GeometryType.Polygon:
					graphic = await CreateGraphicAsync(legendInfo.EsriSymbol, DrawShape.Polygon);
					break;
				case GeometryType.Envelope:
					break;
			}


			if (featureLayerInfo.FeatureLayer.FeatureTable is GeodatabaseFeatureTable)
			{
				var table = featureLayerInfo.FeatureLayer.FeatureTable as GeodatabaseFeatureTable;
				//_model.SetMessageInfo("Table was not found in the local geodatabase.");
				var feature = new GeodatabaseFeature(table.Schema) {Geometry = graphic.Geometry,};

				if (feature.Schema.Fields.Any(fld => fld.Name == table.ServiceInfo.DisplayField))
					feature.Attributes[table.ServiceInfo.DisplayField] = legendInfo.Label;

				await table.AddAsync(feature);
			}

			if (featureLayerInfo.FeatureLayer.FeatureTable is ServiceFeatureTable)
			{
				var table = featureLayerInfo.FeatureLayer.FeatureTable as ServiceFeatureTable;

				var feature = new GeodatabaseFeature(table.Schema) {Geometry = graphic.Geometry,};

				if (feature.Schema.Fields.Any(fld => fld.Name == table.ServiceInfo.DisplayField))
					feature.Attributes[table.ServiceInfo.DisplayField] = legendInfo.Label;

				await table.AddAsync(feature);
			}
		}
		private FeatureLayerInfo GetFeatureLayerInfoByLegendInfo(LegendInfo legendInfo)
		{
			return
				FeatureLayerInfoItems.FirstOrDefault(
					featureLayerInfoItem => Enumerable.Contains(featureLayerInfoItem.LegendInfos, legendInfo));
		}