Per Code nur auf gefilterte Daten der ICollectionView zugreifen

  • WPF
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von DTF.

    Per Code nur auf gefilterte Daten der ICollectionView zugreifen

    Hallo Leute.

    Mein Programm soll eine Liste der Dateien erstellen, die im DataGrid aktuell angezeigt werden.

    Deklaration der Propertys

    VB.NET-Quellcode

    1. Public Property Coll() As New ObservableCollection(Of Foto_Liste_Klasse)
    2. Public Property View As ICollectionView


    Zuweisung des Filters

    VB.NET-Quellcode

    1. View = CollectionViewSource.GetDefaultView(Coll)
    2. View.Filter = AddressOf Filter


    Der Filter funktioniert. Jetzt würde ich aber gerne auf die gefilterten Daten zugreifen. Mein "View" ist ja nur eine Schnittstelle und bietet mir nicht direkt die Daten an. Sowas wie "View(0).Name" funktioniert ja nicht. Kann man direkt auf die gefilterten Daten zugreifen und macht das Sinn? Oder sollte man lieber die Daten aus der Quell-Collection im Code noch einmal einen Filter durchlaufen lassen und die entsprechenden Daten von hier holen?

    Gruß
    eddi
    Binde die ICollectionView and die ItemSource des DataGrid. Richtig gemacht werden alle, oder nur gefiltere gezeigt.

    In einem aktuellen Projekt habe die Filterung so umgesetzt:
    Spoiler anzeigen

    C#-Quellcode

    1. public ObservableCollection<TitleModel> AllTitles { get => allTitles; set { allTitles = value; RaisePropertyChanged(nameof(AllTitles)); } }
    2. private ObservableCollection<TitleModel> allTitles;
    3. public ICollectionView FilteredTitles //diese ICollectionView habe ich als ItemsSource an ein DataGrid gebunden
    4. {
    5. get
    6. {
    7. ICollectionView source = CollectionViewSource.GetDefaultView(AllTitles);
    8. source.Filter = FilterTitles.Length == 0 ? p => true : p => TitleFilter((TitleModel)p);
    9. return source;
    10. }
    11. private set { }
    12. }
    13. private string filterTitles = "";
    14. public string FilterTitles //an eine textbox gebunden
    15. {
    16. get => filterTitles;
    17. set
    18. {
    19. filterTitles = value;
    20. RaisePropertyChanged(nameof(FilterTitles));
    21. RaisePropertyChanged(nameof(FilteredTitles));
    22. }
    23. }
    24. private bool TitleFilter(TitleModel title)
    25. {
    26. if (FilterTitleTrack && title.Track.ToString().Equals(FilterTitles)) return true;
    27. if (FilterTitleTitle && title.Title.ToLower().Contains(FilterTitles.ToLower())) return true;
    28. if (FilterTitleArtist && title.Artist.ToLower().Contains(FilterTitles.ToLower())) return true;
    29. if (FilterTitleAlbumName && title.AlbumName.ToLower().Contains(FilterTitles.ToLower())) return true;
    30. if (FilterTitleYear && title.Year.ToString().Equals(FilterTitles)) return true;
    31. if (FilterTitleGenre && title.Genre.ToLower().Contains(FilterTitles.ToLower())) return true;
    32. if (FilterTitleAlbumArtist && title.AlbumArtist.ToLower().Contains(FilterTitles.ToLower())) return true;
    33. if (FilterTitleDisc && title.Disc.ToString().Equals(FilterTitles)) return true;
    34. return false;
    35. }

    XML-Quellcode

    1. <DataGrid ItemsSource="{Binding FilteredTitles}" SelectedItem="{Binding SelectedTitle}">


    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D