在Windows Phone 8中选择联系人

我正在尝试将基本联系人列表添加到我的应用程序中。

到目前为止,该应用程序查询联系人存储并在列表中显示所有内容。

我需要的是一个数据结构,其中包含用户从列表中选择的每个联系人的姓名和号码。

我很想看到你的想法。 我相信这将是我错过的简单事情,但我已经尝试了很多,我现在非常困惑。

以下是相关的代码段和随附的XAML。 非常感谢您的参与。 C#更新

namespace appNamespace { public partial class contact : PhoneApplicationPage { public class CustomContact { public string Name { get; set; } public string Number { get; set; } public CustomContact() { } //CTOR that takes in a Contact object and extract the two fields we need (can add more fields) public CustomContact(Contact contact) { Name = contact.DisplayName; var number = contact.PhoneNumbers.FirstOrDefault(); if (number != null) Number = number.PhoneNumber; else Number = ""; } } public contact() { InitializeComponent(); } private void showContacts(object sender, RoutedEventArgs e) { Contacts cons = new Contacts(); //Identify the method that runs after the asynchronous search completes. cons.SearchCompleted += new EventHandler(Contacts_SearchCompleted); //Start the asynchronous search. cons.SearchAsync(String.Empty, FilterKind.None, "Contacts Test #1"); } void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e) { //Do something with the results. MessageBox.Show(e.Results.Count().ToString()); try { //Bind the results to the user interface. ContactResultsData.DataContext = e.Results; } catch (System.Exception) { //No results } if (ContactResultsData.Items.Any()) { ContactResultsLabel.Text = "results"; } else { ContactResultsLabel.Text = "no results"; } } public void saveContacts(object sender, RoutedEventArgs e) { List listOfContacts = new List(); listOfContacts = e.Results.Select(x => new CustomContact() { Number = x.PhoneNumbers.FirstOrDefault() != null ? x.PhoneNumbers.FirstOrDefault().PhoneNumber : "", Name = x.DisplayName }).ToList(); } private void ContactResultsData_SelectionChanged(object sender, SelectionChangedEventArgs e) { Contact contact = ContactResultsData.SelectedItem as Contact; if (contact != null) { CustomContact customContact = new CustomContact(contact); } } } } 

XAML

            

你可以创建你的课程

 public class CustomContact { public string Name { get; set; } public string Number { get; set; } public CustomContact() { } //CTOR that takes in a Contact object and extract the two fields we need (can add more fields) public CustomContact(Contact contact) { DisplayName = contact.DisplayName; var number = contact.PhoneNumbers.FirstOrDefault(); if(number != null) Number = number.PhoneNumber; else Number = ""; } } 

然后迭代结果并将它们添加到您的class级

 List listOfContacts = new List(); foreach (var c in e.Results) { CustomContact contact = new CustomContact(); contact.DisplayName = c.DisplayName; var number = c.PhoneNumbers.FirstOrDefault(); //change this to whatever number you want if (number != null) contact.Number = number.PhoneNumber; else contact.Number = ""; listOfContacts.Add(contact); } ContactResultsData.DataContext = listOfContacts; 

您可以将上面的foreach循环缩短为单个LINQ查询

 listOfContacts = e.Results.Select(x => new CustomContact() { Number = x.PhoneNumbers.FirstOrDefault() != null ? x.PhoneNumbers.FirstOrDefault().PhoneNumber : "", DisplayName = x.DisplayName }).ToList(); 

根据评论更新。

假设您不使用上述方法,ListBox将填充Contact对象(而不是我们的CustomContact对象)。 因此,我们将所选项转换为Contact对象,并使用重载的构造函数接收Contact对象以创建我们想要的CustomContact对象。

 private void ContactResultsData_SelectionChanged(object sender, SelectionChangedEventArgs e) { Contact contact = ContactResultsData.SelectedItem as Contact; if (contact != null) { CustomContact customContact = new CustomContact(contact); } }