【问题标题】:Creating a Listview filter in WPF with a text box search使用文本框搜索在 WPF 中创建 Listview 过滤器
【发布时间】:2015-02-24 15:06:21
【问题描述】:

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

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

【问题讨论】:

  • 您的列表框和搜索框的代码以及它们的 xaml 在哪里?你希望你的列表框什么时候更新它的星星列表? IE。您是否有一个按钮可以在您输入完“Audi”后单击,还是应该在您输入时不断更新?
  • 欢迎来到 SO。不要包含与问题无关的代码。不要有很多空行。搜索文本框被埋在最后。绑定到由 Search 过滤的 iEnumerable。
  • OK 问题需要通过编辑所有的 XAML 来进行清理,这有点远。现在没有 XAML,因为我希望能够在我的搜索文本框(称为“搜索”)和我的列表视图 (lstStar) 中输入。

标签: c# wpf listview filter


【解决方案1】:

您可以使用 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 设置为的内容。到目前为止,这假设您要将某种属性更改放入搜索文本框中,然后可能单击一个按钮,例如“搜索”,然后告诉列表检查并重新填充以匹配搜索词。

【讨论】:

    【解决方案2】:

    这就是我在类似应用程序中的过滤方式

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-07
      • 2018-09-24
      • 2021-10-31
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      相关资源
      最近更新 更多