C# 联系选取器获取电子邮件地址
我正在使用ContactPicker类将Windows 8 People应用程序集成到我的应用程序中。 当点击一个按钮时,我会加载People应用程序。用户选择一些朋友,我想在列表视图中显示他们的姓名、图像和电子邮件地址 我在显示名称和图像方面没有问题。它不显示电子邮件地址,而是显示:System.Collections.Generic.List`1[System.String]任何解决方案C# 联系选取器获取电子邮件地址,c#,windows-8,windows-runtime,peoplepicker,C#,Windows 8,Windows Runtime,Peoplepicker,我正在使用ContactPicker类将Windows 8 People应用程序集成到我的应用程序中。 当点击一个按钮时,我会加载People应用程序。用户选择一些朋友,我想在列表视图中显示他们的姓名、图像和电子邮件地址 我在显示名称和图像方面没有问题。它不显示电子邮件地址,而是显示:System.Collections.Generic.List`1[System.String]任何解决方案 IReadOnlyList<GetContactDetails> ConDetail
IReadOnlyList<GetContactDetails> ConDetails;
public IReadOnlyList<GetContactDetails> ContactDetails
{
get { return ConDetails; }
set { ConDetails = value; }
}
List<GetContactDetails> Contact;
public List<GetContactDetails> SetContacts
{
get { return Contact; }
set { Contact = value; }
}
private async void Contacts_Click(object sender, RoutedEventArgs e)
{
SetContacts = new List<App1.GetContactDetails>();
var contactSelector = new Windows.ApplicationModel.Contacts.ContactPicker();
contactSelector.CommitButtonText = "Pick contact";
var SelectedContact = await contactSelector.PickMultipleContactsAsync();
foreach (var item in SelectedContact)
{
SetContacts.Add(new GetContactDetails(item));
}
ContactList.ItemsSource = SetContacts;
}
IReadOnlyList condentails;
公共IReadOnlyList联系人详细信息
{
获取{return ConDetails;}
设置{ConDetails=value;}
}
名单联系人;
公共联系人列表
{
获取{返回联系人;}
设置{Contact=value;}
}
专用异步无效联系人\u单击(对象发送方,路由目标)
{
SetContacts=新列表();
var contactSelector=new Windows.ApplicationModel.Contacts.ContactPicker();
contactSelector.CommitButtonText=“选择联系人”;
var SelectedContact=await contactSelector.PickMultipleContactsAsync();
foreach(SelectedContact中的var项)
{
SetContacts.Add(新的GetContactDetails(项目));
}
ContactList.ItemsSource=设置联系人;
}
XAML:
GetContactDetails类:
public class GetContactDetails
{
public string ContactName { get; private set; }
public BitmapImage ContactImage { get; private set; }
public Visibility CanShow { get; set; }
public List<string> PhoneNumbers { get; set; }
public List<string> ContactEmails { get; set; }
public GetContactDetails(ContactInformation c)
{
PhoneNumbers = new List<string>();
ContactEmails = new List<string>();
CanShow = Visibility.Visible;
ContactName = c.Name;
if (c.PhoneNumbers.Count > 0)
{
foreach (var item in c.PhoneNumbers)
{
PhoneNumbers.Add(item.Value);
}
}
else
{
CanShow = Visibility.Collapsed;
}
GetContactImage(c);
}
async void GetContactImage(ContactInformation Img)
{
var imgStream = await Img.GetThumbnailAsync();
ContactImage = new BitmapImage();
if (imgStream != null && imgStream.Size > 0)
{
ContactImage.SetSource(imgStream);
}
}
}
公共类GetContactDetails
{
公共字符串ContactName{get;private set;}
公共BitmapImage ContactImage{get;private set;}
公共可见性可以显示{get;set;}
公共列表电话号码{get;set;}
公共列表联系人电子邮件{get;set;}
公共GetContactDetails(联系人信息c)
{
PhoneNumber=新列表();
ContactEmails=新列表();
CanShow=可见性;
ContactName=c.名称;
如果(c.PhoneNumbers.Count>0)
{
foreach(c.PhoneNumber中的变量项)
{
电话号码。添加(项。值);
}
}
其他的
{
CanShow=可见性。已折叠;
}
GetContactImage(c);
}
异步无效GetContactImage(ContactInformation Img)
{
var imgStream=await Img.GetThumbnailAsync();
ContactImage=新的BitmapImage();
if(imgStream!=null&&imgStream.Size>0)
{
ContactImage.SetSource(imgStream);
}
}
}
看起来您的代码没有将信息添加到联系人电子邮件中。你不需要这样的东西吗
public List<string> PhoneNumbers { get; set; }
public List<string> ContactEmails { get; set; }
public GetContactDetails(ContactInformation c)
{
PhoneNumbers = new List<string>();
ContactEmails = new List<string>();
CanShow = Visibility.Visible;
ContactName = c.Name;
if (c.PhoneNumbers.Count > 0)
{
foreach (var item in c.PhoneNumbers)
{
PhoneNumbers.Add(item.Value);
}
}
else
{
CanShow = Visibility.Collapsed;
}
/// Don't you need the below code somewhere?//////
if (c.Emails.Count > 0)
{
foreach (var item in c.Emails)
{
ContactEmails .Add(item.Value);
}
}
///////////////////////////////////////////////////////////////
else
{
CanShow = Visibility.Collapsed;
}
GetContactImage(c);
}
公共电话号码列表{get;set;}
公共列表联系人电子邮件{get;set;}
公共GetContactDetails(联系人信息c)
{
PhoneNumber=新列表();
ContactEmails=新列表();
CanShow=可见性;
ContactName=c.名称;
如果(c.PhoneNumbers.Count>0)
{
foreach(c.PhoneNumber中的变量项)
{
电话号码。添加(项。值);
}
}
其他的
{
CanShow=可见性。已折叠;
}
///你不需要下面的代码吗//////
如果(c.Emails.Count>0)
{
foreach(c.email中的var项)
{
联系人电子邮件。添加(项。值);
}
}
///////////////////////////////////////////////////////////////
其他的
{
CanShow=可见性。已折叠;
}
GetContactImage(c);
}
不能将文本块设置为列表。您需要将ContactEmail解析为单独的字符串。也许是这样的:
创建名为ContactEmailString的属性
string _contactEmailString;
public string ContactEmailsString
{
get{
return _contactEmailString;
}
set
{
value=_contactEmailString;
NotifyPropertyChanged("ContactEmailString");
}
}
然后在设置联系人信息的函数中执行以下操作:
foreach(var item in ContactEmails)
{
ContactEmailString+=item+";";
}
然后在xaml中绑定到ContactEmailString而不是ContactEmail
<TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding ContactEmailString}" FontSize="10" FontWeight="Bold"></TextBlock>
您在哪里设置ContactEmail中的值?用户是否在某处输入了此信息?电子邮件地址来自Windows 8 People应用程序。用户无法输入此信息,他只能选择要查看详细信息的朋友。可能我遗漏了什么。在某个地方,代码需要访问该电子邮件列表并将ContactEmails设置为该列表。你在哪里这么做?我想问题出在System.Collections.Generic.List`1[System.String]上。这表明我正在尝试显示一个列表对象,而不是列表中的值。是的,但是如果我们看不到您在哪里将ContactEmail设置为电子邮件值,则很难判断。我只是考虑了我的答案,是的,这是行不通的。我添加了一个新的答案,可能就是这个问题。要确保实现INotifyPropertyChanged,需要能够正确绑定到ContactEmailString
<TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding ContactEmailString}" FontSize="10" FontWeight="Bold"></TextBlock>