2015-02-24 128 views
0

我正在使用名为star.xml的XML文件创建应用程序,以将我的数据存储在列表视图中。我对c#和编程非常陌生,需要任何帮助 基本上,我希望能够输入我的搜索文本框(称为'search')和我的列表视图(lstStar),以仅显示匹配的记录。即输入“奥迪”只会返回这些项目。 任何帮助将非常感激 仁使用文本框搜索在WPF中创建Listview筛选器

namespace StarinCar 
{ 
    public partial class MainWindow : Window 
    { 
     int hot = -2; 
     int Mildly_Moist = -2; 
     int Wet = -4; 
     int Very_Wet = -6; 
     private ObservableCollection<star> starData; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      starData = new ObservableCollection<star>(); 
      lstStar.ItemsSource = starData; 

      try 
      { 
       XmlSerializer xs = new XmlSerializer(typeof(ObservableCollection<star>)); 
       using (StreamReader rd = new StreamReader("star.xml")) 
       { 
        starData = xs.Deserialize(rd) as ObservableCollection<star>; 
       } 
      } 
      catch 
      { 

      } 

      lstStar.ItemsSource = starData; 

      lblAverage.Content = starData.Average(i => i.time).ToString(); 
      lblFastest.Content = starData.Min(i => i.time).ToString(); 
      lblSlowest.Content = starData.Max(i => i.time).ToString(); 
     } 

     private void btnAdd_Click(object sender, RoutedEventArgs e) 
     { 
      star newStar = new star(); 

      newStar.firstName = txtName.Text; 
      newStar.time = int.Parse(txtTime.Text); 
      newStar.car = txtCar.Text; 
      newStar.track = txtTrack.Text; 

      starData.Add(newStar); 

      if (txtTrack.Text.Contains("Hot") || (txtTrack.Text.Contains("hot") == true)) 
      { 
       newStar.time = int.Parse(txtTime.Text) + hot; 
      } 

      if (txtTrack.Text.Contains("Mildly Moist") || (txtTrack.Text.Contains("mildly moist")) == true) 
      { 
       newStar.time = int.Parse(txtTime.Text) + Mildly_Moist; 
      } 

      if (txtTrack.Text.Contains("Wet") || (txtTrack.Text.Contains("wet") == true)) 
      { 
       newStar.time = int.Parse(txtTime.Text) + Wet; 
      } 

      if (txtTrack.Text.Contains("Very Wet") || (txtTrack.Text.Contains("very wet")) == true) 
      { 
       newStar.time = int.Parse(txtTime.Text) + Very_Wet; 
      } 
     } 

     private void Window_Closed(object sender, EventArgs e) 
     { 
      XmlSerializer xs = new XmlSerializer(typeof(ObservableCollection<star>)); 
      using (StreamWriter wr = new StreamWriter("star.xml")) 
      { 
       xs.Serialize(wr, starData); 
      } 
     } 
    } 
} 
+0

哪里是你的列表框和搜索框,以及它们的XAML代码是如何筛选?你什么时候想让你的列表框更新它的星星列表?即。在完成“奥迪”输入后,你有没有按钮,或者是否应该不断更新,如果你输入或输入了什么内容? – 2015-02-24 15:11:40

+0

欢迎来到SO。不要包含与问题无关的代码。不要有很多空白行。搜索TextBox被埋在那里。绑定到通过搜索过滤的iEnumerable。 – Paparazzi 2015-02-24 15:21:16

+0

好的问题需要一些清理通过编辑出来所有的XAML是有点远。现在没有XAML,因为我希望能够输入我的搜索文本框(称为“搜索”)和我的列表视图(lstStar)。 – Paparazzi 2015-02-24 17:11:01

回答

0

你可以使用的ICollectionView。所以你会有你的“整体” 明星收藏'starData'。但是,你的列表框的ItemsSource将被绑定到这样的事情:

public ICollectionView FilteredStars 
    { 
     get 
     { 
      ICollectionView source = CollectionViewSource.GetDefaultView(starData); 
      source.Filter = new Predicate<object>(FilterStars); 

      return source; 
     } 
    } 

,做这里的筛选逻辑:

private bool FilterStars(object item) 
    { 
     bool b = false; 
     star a = item as star; 

     if (a != null) 
     { 
      if (a.Name.Contains(searchBoxText)) //your filter logic here 
      { 
        b = true; 
      } 
      else if String.IsNullOrWhiteSpace(searchBoxText) 
      { 
        b = true; 
      } 
     } 

     return b; 
    } 

基本上,你有你的主要收集,那么一些逻辑过滤你的主要收藏过滤的集合,这就是你应该设置你的列表框的itemssource。到目前为止,这是假设您将在您的搜索文本框中添加某种属性更改,然后单击按钮(如“搜索”),然后通知列表检查并重新填充以匹配搜索项。

-1

这是我在一个类似的应用程序

public IEnumerable<string> PastEntries1 
    { 
     get 
     { 
      if(string.IsNullOrEmpty(textValue)) 
      { 
       return FieldDefString.PastEntries; 
      } 
      else 
      { 
       return FieldDefString.PastEntries.Where(x => x.StartsWith(textValue, StringComparison.OrdinalIgnoreCase)); 
      } 
     } 
    } 
+0

关注评论 – Paparazzi 2015-02-24 16:51:45