如何使用c#在windows store app中实现搜索列表视图

时间:2014-02-23 13:39:53

标签: c# windows-store-apps

listview的Xaml代码是这样的。我在listview的每个项目中填充Id,名称和电子邮件.Listview名称是resultview。有一个要搜索的文本框。

<TextBox Text="{Binding SearchText, Mode=TwoWay,Source=PropertyChanged}"/>

<ListView Name="ResultsView" IsItemClickEnabled="True" Margin="0,65,4,0" SelectionChanged="ResultsView_SelectionChanged_1" ItemsSource="{Binding contacts}" Background="White" ItemClick="ResultsView_ItemClick" Loaded="ResultsView_Loaded">
    <ListView.ItemTemplate> 
        <TextBlock x:Name="st1" Text="{Binding id}" FontSize="28" Grid.Row="0" Foreground="Black"/>                                        
        <TextBlock x:Name="st2" Text="{Binding name}" FontSize="22" Grid.Row="1" Foreground="Black"/>
        <TextBlock x:Name="st3" Text="{Binding email}" FontSize="22" Grid.Row="2" Foreground="Black"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

这是班级

    public class Phone
    {
        public string mobile { get; set; }
        public string home { get; set; }
        public string office { get; set; }
    }

    public class Contact
    {
        public string id { get; set; }
        public string name { get; set; }
        public string email { get; set; }
        public string address { get; set; }
        public string gender { get; set; }
        public Phone phone { get; set; }
    }


    public class RootObject
    {
        public ObservableCollection<Contact> contacts { get; set; }
    }

在我的应用程序中,Resultview的数据上下文设置如下。

var _Data = JsonConvert.DeserializeObject<RootObject>(jsonString);
ResultsView.DataContext = _Data;

现在我需要的是当文本框中的文本更改时,listview项目应根据名称进行过滤。

正如你所说,我添加了这部分。它显示errors.errors在注释行

public string SearchText
  {
      get
      {
       return SearchText;
      }
      set
      {
        if(SearchText == value)
        return;
        SearchText = value;
        Contacts.Clear();//Here it says contacts doesnt exists in the current context.
        foreach(var item in ResultsView.where(contact => contact.Name.Contains(SearchText)))//it shows windows.UI.XAML.Listview does not contaain definion for where
           {
           Contacts.Add(item);
           }
       }
    }

我收到了这两个错误。我正在Windows商店应用程序上工作,而不是在Windows手机上。这就是我所做的一切。如果它没有成功,请提供一个替代解决方案。 -Thanks

1 个答案:

答案 0 :(得分:0)

以下是您的需求:

  • ViewModel(您应该使用Mvvm)
  • CollectionViewSource
  • 选择过滤内容的方法
  • 过滤数据的方法

创建一个ViewModel。这是您的联系人所在的位置。创建ObservableCollection<Contact> Contacts。在初始化时,将此ObservableCollection填充为you would like.将基本列表的副本保存为_baseContactList;

在View中,在Page.Resources中创建一个CollectionViewSource作为StaticResource。将其内容绑定到您的收藏夹。

将列表的ItemsSource设置为CVS。

现在,您需要创建一种确定要排序的方法。您可以执行诸如将ComboBox绑定到ViewModel中的string属性之类的操作。该属性的setter将更改您的支持ObservableCollection的值,类似于:

public string SearchText
{
    get
    {
        return _searchText;
    }
    set
    {
        if(_searchText == value)
            return;
        _searchText = value;
        Contacts.Clear();

        foreach(var item in _baseContactList.Where(contact => 
            contact.Name.Contains(_searchText))
        {
            Contacts.Add(item);
        }
    }

现在,这非常低效,可能不适合你。首先,它会在每次更改后清除搜索。您可能希望使用ReactiveExtensions进行限制,以便在最后一次击键后仅重新填充半秒。其次,您可能希望将条件(contact.Name.Contains(_searchText))替换为您的自定义条件,可能还包括检查电子邮件。您可能还希望删除区分大小写(通过比较.ToLower()Name的“_searchText”版本,或者您要比较的两个版本。

因此,为了实现这一点,您需要一个将其当前字符串连接到SearchText的TextBox。像这样:

<TextBox Text="{Binding SearchText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

Binding语句定位SearchText属性,确保对TextBox的任何更改都会反映在SearchText(通过Mode=TwoWay)中,然后告知它通过设置UpdateSourceTrigger来每次文本更改时(在每次击键时)发送更改。

您可能希望添加的一些未来工作是清除和重新填充是否受限制和异步,以及使用IncrementallyLoadingObservableCollection。使用增量加载器实际上是这样的,因此你不一定需要节流,因为它一次只能加载大约5个。您可以查找制作指南。

应该是它(除了为每个项目设计样式)。希望这能让你顺利上路!