2

使用此代码,我正在设置我的数据网格的 Itemsource。但是,我得到了更多需要过滤数据网格的 wpf 控件,例如从时间范围。我可以为此编写一个新查询,但这似乎没有必要,因为数据已经可用,我只需要过滤它。但是最好的方法是什么?

我真的很感激任何帮助!

DateTime dateStart = CalenderSearch.SelectedDates.First();
DateTime dateEnd = CalenderSearch.SelectedDates.Last();

ObjectQuery<Fouten> fouten = eventsEntities.Foutens;

                var query =
                (from fout in fouten
                 where dateStart <= fout.Datum && dateEnd >= fout.Datum && fout.Rapporten.Treinen.NameTrein == trein.NameTrein
                 orderby fout.Datum, fout.Time


                 select new
                 {
                     Datum = fout.Datum,
                     Time = fout.Time,
                     FoutCode = fout.FoutCode,
                     Omschrijving = fout.Omschrijving,
                     Teller = fout.Teller,
                     Module = fout.Module,
                     FoutId = fout.FoutId

                 }).AsEnumerable().Select(x => new Fouten
                 {
                     Datum = x.Datum,
                     Time = x.Time,
                     FoutCode = x.FoutCode,
                     Omschrijving = x.Omschrijving,
                     Teller = x.Teller,
                     Module = x.Module,
                     FoutId = x.FoutId
                 }).ToList();

if (query.Count == 0)
                    foutensDataGrid.ItemsSource = null;
                else
                    foutensDataGrid.ItemsSource = query;
4

2 回答 2

2

在 WPF 中,用作ItemsSourceGUI 元素中的每个集合都有一个ICollectionView关联。
ICollectionView有一个Filter属性,它的类型是Predicate<object>.

如果您设置它Filter并在之后调用Refresh(),DataGrid 将自行更新以仅显示Filter返回 true 的项目。

一个如何使用它的例子:

var collectionView = CollectionViewSource.GetDefaultView(foutensDataGrid.ItemsSource);
collectionView.Filter = o => {
    var fouten = o as Fouten;
    //do your filtering, e.g.
    return fouten.Datum <= dateEnd && fouten.Datum >= dateStart;
}
collectionView.Refresh();
于 2016-03-03T07:50:18.340 回答
0

您可以将加载的数据保存在类字段中,然后通过句柄 buttonClicks 对其进行过滤:

public class YourView
{
    private List<Fouten> loadedData;
    public void LoadData(...)
    {
        ObjectQuery<Fouten> fouten = eventsEntities.Foutens;

        // here you save unfiltered data to the field and then you can use it to filter collection
        loadedData = ...;

        // if you want to filter values immediately you can call filter method right here
        // FilterByFoutCode(someValue);

        if (loadedData.Count == 0)
            foutensDataGrid.ItemsSource = null;
        else
            foutensDataGrid.ItemsSource = loadedData;
    }

    private void FilterByFoutCodeButtonClick(object sender, EventArgs e)
    {
        var filter = FoutCodeTextBox.Content.ToString();
        if(!string.IsNullOrEmpty(filter))
        {
            // if your filter is not empty then filter loadedData by criteria 
            FilterByFoutCode(filter);
        }
    }

    private void FilterByFoutCode(string filter)
    {
        foutensDataGrid.ItemsSource = loadedData.Where(x => x.FoutCode == filter);
    }
}

此外,在性能上下文中,您不应该通过和对您的集合进行额外的迭代select new {...},只需在 LINQ 查询之后立即调用。.AsEnumerable()Select(...)ToList()

最后, MVVM 模式是 WPF 的标准事实,它对您的应用程序很有用。

于 2016-03-03T07:50:03.903 回答