Selecting phone book contacts in Windows Phone using MVVM

Introduction:
Windows phone API allows us to access the phone book contact list using the code. Contacts are fetched in an observable list with details like Display Name, Company, Phone Number etc bundled in the Contacts object. These contacts can then be displayed in a list box with required details.
Following examples demonstrates the same.

Description:
We will use the Contacts class to fetch the details of phone book contacts.
To start with windows phone Contacts class first and foremost requirement is that of adding a capability of ID_CAP_CONTACTS in the WMAppManifest.xml file.
To add a capability either edit the XML or select the Capabilities tab from WMAppManifest.xml file and select the ID_CAP_CONTACTS check box located in the left part of the screen.

XML representation of the capability in WMAppManifest.xml:

    <Capabilities>
      <Capability Name="ID_CAP_CONTACTS" />
    </Capabilities>

Pictorial representation of the capabilities in WMAppManifest.xml :

Adding Capabilities in Visual Studio

Adding Capabilities in Visual Studio

Now it’s time to move with the code to fetch the contact details. Let’s display all contacts using the search method from the Contacts class in MVVM pattern.

MainPage.xaml

<Grid x:Name="LayoutRoot" Background="Transparent">
        <ListBox x:Name="lbMyContactNames" ItemsSource="{Binding Path=ListContactData}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=ContactName}" Margin="20" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>

MainPage.xaml.cs

// Constructor
public MainPage()
{
     InitializeComponent();

     //assign the data context object
     lbMyContactNames.DataContext = new ContactsDemoViewModel();
}

ContactsDemoViewModel.cs

using Microsoft.Phone.UserData;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;

namespace ContactsChooser
{
    class ContactsDemoViewModel : INotifyPropertyChanged
    {


        //property chnaged event
        public event PropertyChangedEventHandler PropertyChanged;
        private Contacts myPersonalContacts;
        private List<string> listData;

        /// <summary>
        /// property to set the list of names
        /// takes object of the type ContactsDemoModel
        /// </summary>
        public List<ContactsDemoModel> ListContactData{get;set;}

        /// <summary>
        /// Constructor define the search criteria here
        /// so as to load the data on app start
        /// </summary>
        public ContactsDemoViewModel() {

            //Create an object of the search class
            myPersonalContacts = new Contacts();

            //perform search with a Blank parameter to get all details
            myPersonalContacts.SearchCompleted += myPersonalContacts_SearchCompleted;

            //create the list object
            listData = new List<string>();

//test object my name passed so as to check the object being retrieved in state
            string myName = "Anobik Dey";

            //start the search and wait for it to complete - async method
            myPersonalContacts.SearchAsync(string.Empty, FilterKind.DisplayName, myName);
        }

        /// <summary>
        /// Event fired when search is complete
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void myPersonalContacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
        {
            ListContactData = new List<ContactsDemoModel>();

            //results will be populated in the ContactsSearchEventArgs object
            //so loop through and add to the list
            for (int i = 0; i < e.Results.Count(); i++) {

//add contact data to new ContactsDemoModel object so as to bind to text box
                ListContactData.Add(new ContactsDemoModel(){ContactName = e.Results.ElementAt(i).DisplayName});
                
            }
            //raise the property changed event to reflect data in the list
             RaisePropertyChanged("ListContactData");
        }

        /// <summary>
        /// Event raised when we add a value to a property
        /// </summary>
        /// <param name="property"></param>
        protected void RaisePropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }
    }
}

ContactsDemoModel.cs

class ContactsDemoModel
    {
        public string ContactName{get;set;}
    }

Summary:
Using the above code we can display the names of all contacts in the list box. For selecting a particular set of contact we can use the SearchAsync function with the search parameters while for fetching all the contacts. we can search with a string.Empty or a blank (“”) argument as a result all the contacts will be fetched.

Written By: Anobik Dey, Software Developer, Mindfire Solutions

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s