Solved! Go to Solution.
For geocoding services use the "Search" tool and configure it to use your geocoding service.
<StackPanel Orientation="Vertical"> <TextBlock Width="299" Margin="0,0,0,10" HorizontalAlignment="Center" FontWeight="Bold" Text="Enter Address Information" /> <StackPanel HorizontalAlignment="Left" Orientation="Horizontal"> <TextBlock Width="80" VerticalAlignment="Center" Text="Address: " TextAlignment="Right" /> <TextBox x:Name="SingleLine" Width="280" TabIndex="1" Text="{Binding Path=InputAddress.SingleLine, Mode=TwoWay}"> <i:Interaction.Behaviors> <local:UpdateBindingOnTextChanged /> </i:Interaction.Behaviors> </TextBox> </StackPanel> <Button x:Name="FindAddressButton" Width="80" Height="24" Margin="0,10,0,0" TabIndex="2" HorizontalAlignment="Center" HorizontalContentAlignment="Center" Command="{Binding AddressToLocation}" CommandParameter="{Binding InputAddress}" Content="Find"> </Button> </StackPanel>
using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Input; using ESRI.ArcGIS.Client.Extensibility; using ESRI.ArcGIS.Client.Tasks; namespace MyAddressLocationTool { public class AddressLocationViewModel : INotifyPropertyChanged { private AddressLocationConfigData data = null; public AddressLocationViewModel(Map map, AddressLocationConfigData data) { this.Map = map; this.data = data; ValidateConfigData(data); InputAddress = new Address(); AddressToLocation = new AddressToLocationCommand(); AddressToLocation.LocatorURL = data.AddressLocatorURL; AddressToLocation.Completed += AddressToLocation_Completed; AddressToLocation.Failed += AddressToLocation_Failed; } public Map Map { get; private set; } public Address InputAddress { get; private set; } public AddressToLocationCommand AddressToLocation { get; private set; } private void ValidateConfigData(AddressLocationConfigData addressLocationConfigData) { Exception ex = null; if (addressLocationConfigData == null) { MainApplication.Handle("Search Configuration Error", "AddressLocation configuration is null"); throw ex; } else if (string.IsNullOrWhiteSpace(addressLocationConfigData.AddressLocatorURL)) { MainApplication.Handle("Search Configuration Error", "Address Locator URL is empty"); throw ex; } } private string error; public string Error { get { return error; } private set { if (error != value) { error = value; OnPropertyChanged("Error"); } } } private List<AddressCandidate> matchCandidates; public List<AddressCandidate> MatchCandidates { get { return matchCandidates; } set { if (matchCandidates == null || !matchCandidates.Equals(value)) { matchCandidates = value; OnPropertyChanged("MatchCandidates"); } } } private void AddressToLocation_Completed(object sender, AddressToLocationsEventArgs e) { MatchCandidates = e.Results; } private void AddressToLocation_Failed(object sender, TaskFailedEventArgs e) { Error = e.Error.Message; } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public class Address : INotifyPropertyChanged { private string _singleline; public string SingleLine { get { return _singleline; } set { if (_singleline != value) _singleline = value; OnPropertyChanged("SingleLine"); } } //private string _street; //public string Street //{ // get // { // return _street; // } // set // { // if (_street != value) // _street = value; // OnPropertyChanged("Street"); // } //} //private string _city; //public string City //{ // get // { // return _city; // } // set // { // if (_city != value) // _city = value; // OnPropertyChanged("City"); // } //} //private string _state; //public string State //{ // get // { // return _state; // } // set // { // if (_state != value) // _state = value; // OnPropertyChanged("State"); // } //} //private string _zipCode; //public string ZipCode //{ // get // { // return _zipCode; // } // set // { // if (_zipCode != value) // _zipCode = value; // OnPropertyChanged("ZipCode"); // } //} public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public class AddressToLocationCommand : ICommand { private Address address; private string locatorURL = string.Empty; public string LocatorURL { get { return locatorURL; } set { locatorURL = value; } } public bool CanExecute(object parameter) { Address newAddress = parameter as Address; if (address == null || !address.Equals(newAddress)) { if (address != null) address.PropertyChanged -= Address_PropertyChanged; address = newAddress; if (address != null) address.PropertyChanged += Address_PropertyChanged; } if (address == null) return false; return !string.IsNullOrEmpty(address.SingleLine); //return !string.IsNullOrEmpty(address.Street) && !string.IsNullOrEmpty(address.City) // && !string.IsNullOrEmpty(address.State) && !string.IsNullOrEmpty(address.ZipCode); } private void Address_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (CanExecuteChanged != null) CanExecuteChanged(this, EventArgs.Empty); } public event EventHandler CanExecuteChanged; public void Execute(Object parameter) { //Locator locatorTask = new Locator("http://tasks.arcgisonline.com/ArcGIS/rest/services/Locators/TA_Streets_US/GeocodeServer"); Locator locatorTask = new Locator(locatorURL); locatorTask.AddressToLocationsCompleted += new EventHandler<AddressToLocationsEventArgs>(locatorTask_AddressToLocationsCompleted); locatorTask.Failed += new EventHandler<TaskFailedEventArgs>(locatorTask_Failed); AddressToLocationsParameters addressParams = new AddressToLocationsParameters() { OutSpatialReference = MapApplication.Current.Map.SpatialReference }; Address address = parameter as Address; Dictionary<string, string> addressDict = addressParams.Address; addressDict.Add("SingleLine", address.SingleLine); //addressDict.Add("Street", address.Street); //addressDict.Add("City", address.City); //addressDict.Add("State", address.State); //addressDict.Add("Zip", address.ZipCode); locatorTask.AddressToLocationsAsync(addressParams); } private void locatorTask_Failed(object sender, TaskFailedEventArgs e) { if (Failed != null) Failed(this, e); } private void locatorTask_AddressToLocationsCompleted(object sender, AddressToLocationsEventArgs e) { if (Completed != null) Completed(this, e); } public event EventHandler<AddressToLocationsEventArgs> Completed; public event EventHandler<TaskFailedEventArgs> Failed; } }
Jamal: rest of example code
Code behind:using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Input; using ESRI.ArcGIS.Client.Extensibility; using ESRI.ArcGIS.Client.Tasks; namespace MyAddressLocationTool { public class AddressLocationViewModel : INotifyPropertyChanged { private AddressLocationConfigData data = null; public AddressLocationViewModel(Map map, AddressLocationConfigData data) { this.Map = map; this.data = data; ValidateConfigData(data); InputAddress = new Address(); AddressToLocation = new AddressToLocationCommand(); AddressToLocation.LocatorURL = data.AddressLocatorURL; AddressToLocation.Completed += AddressToLocation_Completed; AddressToLocation.Failed += AddressToLocation_Failed; } public Map Map { get; private set; } public Address InputAddress { get; private set; } public AddressToLocationCommand AddressToLocation { get; private set; } private void ValidateConfigData(AddressLocationConfigData addressLocationConfigData) { Exception ex = null; if (addressLocationConfigData == null) { MainApplication.Handle("Search Configuration Error", "AddressLocation configuration is null"); throw ex; } else if (string.IsNullOrWhiteSpace(addressLocationConfigData.AddressLocatorURL)) { MainApplication.Handle("Search Configuration Error", "Address Locator URL is empty"); throw ex; } } private string error; public string Error { get { return error; } private set { if (error != value) { error = value; OnPropertyChanged("Error"); } } } private List<AddressCandidate> matchCandidates; public List<AddressCandidate> MatchCandidates { get { return matchCandidates; } set { if (matchCandidates == null || !matchCandidates.Equals(value)) { matchCandidates = value; OnPropertyChanged("MatchCandidates"); } } } private void AddressToLocation_Completed(object sender, AddressToLocationsEventArgs e) { MatchCandidates = e.Results; } private void AddressToLocation_Failed(object sender, TaskFailedEventArgs e) { Error = e.Error.Message; } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public class Address : INotifyPropertyChanged { private string _singleline; public string SingleLine { get { return _singleline; } set { if (_singleline != value) _singleline = value; OnPropertyChanged("SingleLine"); } } //private string _street; //public string Street //{ // get // { // return _street; // } // set // { // if (_street != value) // _street = value; // OnPropertyChanged("Street"); // } //} //private string _city; //public string City //{ // get // { // return _city; // } // set // { // if (_city != value) // _city = value; // OnPropertyChanged("City"); // } //} //private string _state; //public string State //{ // get // { // return _state; // } // set // { // if (_state != value) // _state = value; // OnPropertyChanged("State"); // } //} //private string _zipCode; //public string ZipCode //{ // get // { // return _zipCode; // } // set // { // if (_zipCode != value) // _zipCode = value; // OnPropertyChanged("ZipCode"); // } //} public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public class AddressToLocationCommand : ICommand { private Address address; private string locatorURL = string.Empty; public string LocatorURL { get { return locatorURL; } set { locatorURL = value; } } public bool CanExecute(object parameter) { Address newAddress = parameter as Address; if (address == null || !address.Equals(newAddress)) { if (address != null) address.PropertyChanged -= Address_PropertyChanged; address = newAddress; if (address != null) address.PropertyChanged += Address_PropertyChanged; } if (address == null) return false; return !string.IsNullOrEmpty(address.SingleLine); //return !string.IsNullOrEmpty(address.Street) && !string.IsNullOrEmpty(address.City) // && !string.IsNullOrEmpty(address.State) && !string.IsNullOrEmpty(address.ZipCode); } private void Address_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (CanExecuteChanged != null) CanExecuteChanged(this, EventArgs.Empty); } public event EventHandler CanExecuteChanged; public void Execute(Object parameter) { //Locator locatorTask = new Locator("http://tasks.arcgisonline.com/ArcGIS/rest/services/Locators/TA_Streets_US/GeocodeServer"); Locator locatorTask = new Locator(locatorURL); locatorTask.AddressToLocationsCompleted += new EventHandler<AddressToLocationsEventArgs>(locatorTask_AddressToLocationsCompleted); locatorTask.Failed += new EventHandler<TaskFailedEventArgs>(locatorTask_Failed); AddressToLocationsParameters addressParams = new AddressToLocationsParameters() { OutSpatialReference = MapApplication.Current.Map.SpatialReference }; Address address = parameter as Address; Dictionary<string, string> addressDict = addressParams.Address; addressDict.Add("SingleLine", address.SingleLine); //addressDict.Add("Street", address.Street); //addressDict.Add("City", address.City); //addressDict.Add("State", address.State); //addressDict.Add("Zip", address.ZipCode); locatorTask.AddressToLocationsAsync(addressParams); } private void locatorTask_Failed(object sender, TaskFailedEventArgs e) { if (Failed != null) Failed(this, e); } private void locatorTask_AddressToLocationsCompleted(object sender, AddressToLocationsEventArgs e) { if (Completed != null) Completed(this, e); } public event EventHandler<AddressToLocationsEventArgs> Completed; public event EventHandler<TaskFailedEventArgs> Failed; } }