2015-02-24 73 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