C# 联系选取器获取电子邮件地址

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

我正在使用ContactPicker类将Windows 8 People应用程序集成到我的应用程序中。 当点击一个按钮时,我会加载People应用程序。用户选择一些朋友,我想在列表视图中显示他们的姓名、图像和电子邮件地址

我在显示名称和图像方面没有问题。它不显示电子邮件地址,而是显示:System.Collections.Generic.List`1[System.String]任何解决方案

    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>