Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WP8联系人异步搜索-仅返回带有电话号码的联系人?_C#_Wpf_Xaml_Windows Phone 8 - Fatal编程技术网

C# WP8联系人异步搜索-仅返回带有电话号码的联系人?

C# WP8联系人异步搜索-仅返回带有电话号码的联系人?,c#,wpf,xaml,windows-phone-8,C#,Wpf,Xaml,Windows Phone 8,我正在开发一个需要自定义联系人列表的应用程序。到目前为止,该应用程序查询联系人,将其全部显示在列表框中,允许多个选择,目前只将所有选定的电话号码写入调试器输出。但我注意到的一件事是,在同步搜索之后,所有联系人都可用,因此其中一些联系人不包含电话号码 现在,在android上,存在一个布尔运算符来过滤联系人-这是contact.HasPhoneNumber,使查询联系人变得非常容易…到目前为止,我还没有找到任何适用于windows的等效运算符。我真的很感激任何帮助 下面是有问题的代码供您阅读,以及

我正在开发一个需要自定义联系人列表的应用程序。到目前为止,该应用程序查询联系人,将其全部显示在列表框中,允许多个选择,目前只将所有选定的电话号码写入调试器输出。但我注意到的一件事是,在同步搜索之后,所有联系人都可用,因此其中一些联系人不包含电话号码

现在,在android上,存在一个布尔运算符来过滤联系人-这是contact.HasPhoneNumber,使查询联系人变得非常容易…到目前为止,我还没有找到任何适用于windows的等效运算符。我真的很感激任何帮助

下面是有问题的代码供您阅读,以及附带的XAML

多谢各位

contact.cs

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<ContactsSearchEventArgs>(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";
            }
        }



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

        public void saveContacts(object sender, RoutedEventArgs e)
        {
            List<CustomContact> listOfContacts = new List<CustomContact>();

            listOfContacts = ContactResultsData.SelectedItems.Cast<Contact>().Select(x => new CustomContact()
            {
                Number = x.PhoneNumbers.FirstOrDefault() != null ? x.PhoneNumbers.FirstOrDefault().PhoneNumber : "",
                Name = x.DisplayName
            }).ToList();


            foreach (var c in listOfContacts)
            {
                Debug.WriteLine(c.Number.ToString());
            }

        }
    }
公共部分类联系人:PhoneApplicationPage
{
公共类客户联系人
{
公共字符串名称{get;set;}
公共字符串编号{get;set;}
公众联络人()
{
}
//接收联系人对象并提取我们需要的两个字段的CTOR(可以添加更多字段)
公共客户联系人(联系人)
{
Name=contact.DisplayName;
var number=contact.PhoneNumbers.FirstOrDefault();
如果(数字!=null)
Number=Number.PhoneNumber;
其他的
数字=”;
}
}
公众联络()
{
初始化组件();
}
私人void showContacts(对象发送者、路由目标)
{
Contacts cons=新联系人();
//标识异步搜索完成后运行的方法。
cons.SearchCompleted+=新事件处理程序(联系人\u SearchCompleted);
//启动异步搜索。
cons.SearchAsync(String.Empty,FilterKind.None,“Contacts Test#1”);
}
无效联系人搜索已完成(对象发件人、联系人搜索目标e)
{
//对结果做点什么。
Show(例如Results.Count().ToString());
尝试
{
//将结果绑定到用户界面。
ContactResultsData.DataContext=e.结果;
}
捕获(系统异常)
{
//没有结果
}
if(ContactResultsData.Items.Any())
{
ContactResultsLabel.Text=“结果”;
}
其他的
{
ContactResultsLabel.Text=“无结果”;
}
}
private void ContactResultsData\u SelectionChanged(对象发送者,SelectionChangedEventArgs e)
{
Contact Contact=ContactResultsData。选择EdItem作为联系人;
如果(联系人!=null)
{
CustomContact CustomContact=新的CustomContact(联系人);
}
}
public void saveContacts(对象发送者、路由目标)
{
List-listOfContacts=新列表();
listOfContacts=ContactResultsData.SelectedItems.Cast().Select(x=>new CustomContact())
{
Number=x.PhoneNumbers.FirstOrDefault()!=null?x.PhoneNumbers.FirstOrDefault()。PhoneNumber:“”,
Name=x.DisplayName
}).ToList();
foreach(合同清单中的var c)
{
Debug.WriteLine(c.Number.ToString());
}
}
}
XAML

<!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="AppName" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock Text="contacts" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <StackPanel Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,10" >

                <TextBlock Name="ContactResultsLabel" Text="results are loading..." Style="{StaticResource PhoneTextLargeStyle}" TextWrapping="Wrap" />

                <ListBox Name="ContactResultsData" ItemsSource="{Binding}" Height="436" Margin="12,0" SelectionMode="Multiple" >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Name="ContactResults" FontSize="{StaticResource PhoneFontSizeMedium}" Text="{Binding Path=DisplayName, Mode=OneWay}" />
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </StackPanel>
            <Button x:Name="showButton" Content="Show Contacts" HorizontalAlignment="Left" VerticalAlignment="Top" Width="218" Height="90" Margin="0,531,0,0" Click="showContacts"/>
            <Button x:Name="saveButton" Content="Save Contacts" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="238,531,0,0" Width="218" Height="90" Click="saveContacts"/>
        </Grid>
    </Grid>

编辑

所以,我明白了

添加此代码:

var filteredContacts = new List<Contact>();

  foreach (var contact in e.Results)
  {
    filteredContacts.AddRange((from phoneNumber in contact.PhoneNumbers
                where phoneNumber.Kind == PhoneNumberKind.Mobile
            select contact).Select(cont => (Contact)cont));
  }
var filteredContacts=new List();
foreach(e.Results中的var触点)
{
filteredContacts.AddRange((来自contact.phoneNumber中的phoneNumber
其中phoneNumber.Kind==PhoneNumberKind.Mobile
选择联系人)。选择(cont=>(cont)cont);
}
到搜索完成事件处理程序筛选联系人正是我想要的