2013-05-29 8 views
0

ContactPicker 클래스를 사용하여 응용 프로그램에 Windows 8 People App을 통합하고 있습니다. 버튼을 클릭하면 피플 앱이로드됩니다. 사용자가 친구를 선택하면 이름, 이미지 및 이메일 주소를 ListView에 표시하려고합니다.연락처 Picker 이메일 주소 얻기

이름과 이미지 표시에 문제가 없습니다. 표시되는 전자 메일 주소를 표시하는 대신 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; 
    } 

XAML :

<ListView x:Name="ContactList" ItemTemplate="{StaticResource contactTemplate}" HorizontalAlignment="Left" Height="271" VerticalAlignment="Top" Width="585"/> 


    <DataTemplate x:Key="contactTemplate"> 
     <Grid Width="400" Height="200" > 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="50"></ColumnDefinition> 
       <ColumnDefinition Width="350"></ColumnDefinition> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="75"></RowDefinition> 
       <RowDefinition Height="75"></RowDefinition> 
       <RowDefinition Height="75"></RowDefinition> 
      </Grid.RowDefinitions> 
      <TextBlock Grid.Column="0" Grid.Row="0" Text="Name" FontSize="20" FontWeight="Bold"></TextBlock> 
      <TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding ContactName}" FontWeight="Bold"></TextBlock> 
      <TextBlock Grid.Column="0" Grid.Row="1" Text="Mail" FontSize="20" FontWeight="Bold"></TextBlock> 
      <TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding ContactEmails}" FontSize="10" FontWeight="Bold"></TextBlock> 
<!--<Image Height="100" Width="100" Grid.Column="1" Grid.Row="1" Source="{Binding ContactImage}" HorizontalAlignment="Left" VerticalAlignment="Center"></Image>--> 


     </Grid> 
    </DataTemplate> 

GetContactDetails 클래스 : 코드가 ContactEmails에 정보를 추가하지 않는 것처럼

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); 
      } 
     } 
    } 
+0

어디에서 ContactEmails 값을 설정합니까? 사용자가이 위치를 입력합니까? –

+0

전자 메일 주소는 Windows 8 People 응용 프로그램에서 가져옵니다. 사용자는이 정보를 입력 할 수 없으며 세부 정보를보고 싶은 친구 만 선택할 수 있습니다. – user1951083

+0

아마 뭔가를 놓치고 있습니다. 어딘가에 코드가 이메일 목록에 액세스하여 ContactEmails를 설정해야합니다. 너 어디에서 그런거야? –

답변

1

보인다. 이런 식으로하면 안 될까요?

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); 
    } 
+0

문제는 System.Collections.Generic.List'1 [System.String]에 있다고 생각합니다. 이 목록의 값 대신 목록 개체를 표시하려고하는 것이 좋습니다. – user1951083

+0

사실, ContactEmails를 이메일 값으로 설정하는 위치가 표시되지 않는지 알기는 어렵습니다. –

+0

방금 ​​내 대답을 생각했는데 작동하지 않습니다. 아마 문제가 될 새로운 대답을 추가했습니다. –

0

TextBlock을 List로 설정할 수 없습니다. ContactEmails를 별도의 문자열로 구문 분석해야합니다. 아마도이 같은 :

가 연락처 정보를 설정하는 함수에 다음

string _contactEmailString; 
    public string ContactEmailsString 
    { 
     get{ 
      return _contactEmailString; 
     } 
     set 
     { 
     value=_contactEmailString; 
     NotifyPropertyChanged("ContactEmailString"); 
     } 
    } 

ContactEmailString

라는 속성을 만들고이 작업을 수행 :

foreach(var item in ContactEmails) 
{ 
    ContactEmailString+=item+";"; 
} 

그런 ContactEmailString 대신 CONTACTEMAIL로 XAML 바인드한다.

<TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding ContactEmailString}" FontSize="10" FontWeight="Bold"></TextBlock> 
+0

불행히도 내가 잘못하지 않는 한 불행히도 작동하지 않습니다. – user1951083

+0

INotifyPropertyChanged를 구현했는지 확인하여 ContactEmailString에 올바르게 바인딩 할 수 있어야합니다. –