Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Selecting Phone Book Contacts in Windows Phone using MVVM

0.00/5 (No votes)
31 Jan 2014 1  
The article describes how to select all the contacts in Windows Phone 7 and 8

Introduction

The tip describes how to select all the contacts and respective data in Windows Phone 7 and 8.

Background

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 the required details.
Following examples demonstrate the same.

Using the Code

We will use the Contacts class to fetch the details of phone book contacts.
To start with Windows Phone Contacts class, the 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:

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

Points of Interest

Using the above code, we can display the names of all contacts in the list box. For selecting a particular set of contacts, 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 of which all the contacts will be fetched.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here