C# 如何通过3个不同的参数搜索我的列表

C# 如何通过3个不同的参数搜索我的列表,c#,wpf,lambda,datagrid,expression,C#,Wpf,Lambda,Datagrid,Expression,我在WPF中将文章列表作为ItemsSource用于我的DataGrid,在同一窗口上,除了DataGrid。xaml我有一个文本框,可以在其中键入一些字母或数字并过滤我的DataGrid,现在我通过以下方式实现了搜索: 文章标题 文章捷径 现在我想实现按文章代码搜索,一篇文章可以包含几个不同的文章代码,现在我创建了按标题和快捷方式搜索,它看起来是这样的(我甚至不知道这样做是不是好方法(一直设置DataGrid源代码): 这是我的文章课: public class Article { p

我在WPF中将文章列表作为
ItemsSource
用于我的
DataGrid
,在同一窗口上,除了
DataGrid
。xaml我有一个文本框,可以在其中键入一些字母或数字并过滤我的
DataGrid
,现在我通过以下方式实现了搜索:

文章标题

文章捷径

现在我想实现按文章代码搜索,一篇文章可以包含几个不同的文章代码,现在我创建了按标题和快捷方式搜索,它看起来是这样的(我甚至不知道这样做是不是好方法(一直设置DataGrid源代码):

这是我的文章课:

public class Article
{
    public Article();

    public List<ArticleCodes> ArticleCode { get; set; }
    public string Title { get; set; }
    public string Shortcut { get; set; }
}
所以lambda表达式mm8write应该如下所示:

private void txtSearch_TextChanged(object sender, TextChangedEventArgs e)
{
    string searchParameter = txtSearch.Text.Trim().ToLower();
    var matchingvalues = articleList.Where(stringToCheck => stringToCheck.Title.ToLower().Contains(searchParameter)
        || stringToCheck.ArticleShortcut.ToLower().Contains(searchParameter)
        || stringToCheck.ArticleCode != null && stringToCheck.ArticleCode.Any(code => !string.IsNullOrEmpty(code.Value) && code.Value.Contains(searchParameter)));

    dtgArtikli.ItemsSource = matchingvalues;
}
但不幸的是,当我在
txtSearch
textbox中键入“123321123321”时,没有结果,这是我们忘记的..hm

谢谢
干杯

我建议您不要使用文本更改事件背后的代码,而是采用MVVM方法,将CLR属性与文本框的文本属性绑定,并为通过设置updatesourcetrigger=“Propertychanged”所做的每一次更改订阅它。您可以在该属性的setter中编写ArtialList筛选器逻辑,您就完成了

如果您在此实施过程中需要任何帮助,请告诉我

XAML


虚拟机

private observeCollection文章列表;
公共可观察收集文章列表
{
获取{return articleList;}
设置
{
articleList=价值;
//这里是INPC方法
}
}
私有字符串搜索参数;
公共字符串搜索参数
{
得到
{
返回搜索参数;
}
设置
{
搜索参数=值;
//ArtialList ItemSource的过滤逻辑如下
//这里是INPC方法
}
}
在这里,每当搜索文本框中的文本发生更改时,将调用SearchParameter CLR属性的set方法,它将调用您将编写的筛选器逻辑。

尝试此操作,并用您要比较的ArticleCodes类的属性的实际名称替换“Code”:

private void txtSearch_TextChanged(object sender, TextChangedEventArgs e)
{
    string searchParameter = txtSearch.Text.Trim().ToLower();
    var matchingvalues = articleList.Where(stringToCheck => stringToCheck.Title.ToLower().Contains(searchParameter)
        || stringToCheck.ArticleShortcut.ToLower().Contains(searchParameter)
        || (stringToCheck.ArticleCode != null && stringToCheck.ArticleCode.Any(code => !string.IsNullOrEmpty(code.Code) && code.Code.ToLower().Contains(searchParameter))));

    dtgArtikli.ItemsSource = matchingvalues;
}

伙计,请检查我的编辑。文章对象的ArticleCode集合是否填充了任何项目?你是对的,我没有返回ArticlesCode表单数据库,我记得我避免了,因为性能原因,如果我加载1000篇文章,每个文章上有10个ArticlesCode,这将是大量数据,因此我在dtgArticles Sel上实现了逻辑如果要获取我所选文章的代码,无论如何,我都必须在db上创建join,以便在表单加载时也返回articleCodes,我猜您编写的lambda表达式将用作charm:):)
private void txtSearch_TextChanged(object sender, TextChangedEventArgs e)
{
    string searchParameter = txtSearch.Text.Trim().ToLower();
    var matchingvalues = articleList.Where(stringToCheck => stringToCheck.Title.ToLower().Contains(searchParameter)
        || stringToCheck.ArticleShortcut.ToLower().Contains(searchParameter)
        || stringToCheck.ArticleCode != null && stringToCheck.ArticleCode.Any(code => !string.IsNullOrEmpty(code.Value) && code.Value.Contains(searchParameter)));

    dtgArtikli.ItemsSource = matchingvalues;
}
<TextBox Text="{Binding SearchParameter,UpdateSourceTrigger=PropertyChanged}" 
         Height="30" Width="150" Margin="10">
</TextBox>
<DataGrid Name="ArticaldgGrid" ItemsSource="{Binding ArticleList}"
          Height="300" Width="300">
</DataGrid>
    private ObservableCollection<Article> articleList;

    public ObservableCollection<Article> ArticleList
    {
        get { return articleList; }
        set
        {
            articleList = value;
            //INPC method here
        }
    }

    private string searchParameter;

    public string SearchParameter
    {
        get
        {
            return searchParameter;
        }
        set
        {
            searchParameter = value;
            //Filter Logic for ArticalList ItemSource goes here
            //INPC method here
        }
    }
private void txtSearch_TextChanged(object sender, TextChangedEventArgs e)
{
    string searchParameter = txtSearch.Text.Trim().ToLower();
    var matchingvalues = articleList.Where(stringToCheck => stringToCheck.Title.ToLower().Contains(searchParameter)
        || stringToCheck.ArticleShortcut.ToLower().Contains(searchParameter)
        || (stringToCheck.ArticleCode != null && stringToCheck.ArticleCode.Any(code => !string.IsNullOrEmpty(code.Code) && code.Code.ToLower().Contains(searchParameter))));

    dtgArtikli.ItemsSource = matchingvalues;
}