michi.wtr
Goto Top

ListBox sortieren C-Sharp WPF

Hi zusammen,

Ich bin gerade dabei, meine erste grafische Anwendung zu programmieren. Gefordert ist, dass ich alle PDF-Dateien im Fenster anzeigen lasse, diese auswählen kann und daraufhin mit ihnen arbeiten kann.

Um die Dateien anzuzeigen, habe ich eine ListBox erstellt. Diese habe ich aber noch nicht ganz verstanden, und finde leider auch nichts, was mir dabei helfen könnte. Mit ein paar Beiträgen im Internet habe ich es hinbekommen, die Dateien anzeigen zu lassen und mit einem extra Button zu öffnen, jedoch glaube ich, dass das viel zu umständlich gemacht ist.

Ich gebe die Ordner an, welche für PDF Dateien durchsucht werden sollen, frage die Pfade (FullName) ab und füge dann die FileInfo der ListBox hinzu. Soweit so gut, doch nun wird, soweit ich das verstanden habe, die ToString Methode auf die FileInfo angewandt, um diese in der ListBox zu repräsentieren....

1. Frage: Um mir nicht den FullName anzeigen zu lassen, habe ich mir eine neue Klasse erstellt, welche 1 Parameter vom Typ FileInfo hat, nur um so die ToString Methode zu überschreiben und mir nur den Dateinamen (ohne Pfad) anzeigen zu lassen. Muss das wirklich so umständlich gelöst werden? Habe zwar im Internet immer wieder gesehen, dass man mit ListBox.DisplayMember wohl den Parameter auswählen könnte, welcher für die Repräsentation genutzt wird, jedoch gibt es diese Eigenschaft bzw. Methode nicht in meinem ListBox Objekt. Was es aber gibt ist ein Parameter DisplayMemberPath der wohl vom Typ String ist, wie also definiere ich, dass von meiner FileInfo -> Name als DisplayMember definiert ist?

2. Frage: Kann ich mir in der ListBox auch mehrere Spalten anzeigen lassen, sodass die Ansicht dem Explorer ähnelt? Evtl. wäre es noch wichtig, dass mir die CreationTime oder LastWriteTime angezeigt werden, oder ist ListBox hierfür das falsche Objekt?

3. Frage: Ich möchte die ListBox anhand der Eigenschaften von FileInfo sortieren lassen. Zwar funktioniert es, die ListBoxItems nach FileInfo -> FullName zu sortieren, jedoch möchte ich 4 verschiedene Sortiermöglichkeiten implementieren: alphabetisch, alphabetisch umgekehrt, neuste Datei zuerst und älteste Datei zuerst. Ist es irgendwie möglich, das automatisch zu implementieren, nach welcher Eigenschaft die ListBoxItems sortiert werden sollen, oder muss ich das alles allein coden, indem ich alle Elemente in eine Liste übernehme, die ListBox clear, die Liste sortiere und dann die sortierte Liste wieder der ListBox hinzufüge?


Hoffe dass ich alles verständlich erklärt habe ^^

Beste Grüße,
Micha

screenshot 2023-04-12 084114

Content-Key: 6738200438

Url: https://administrator.de/contentid/6738200438

Printed on: April 28, 2024 at 12:04 o'clock

Member: Kraemer
Solution Kraemer Apr 12, 2023 at 08:13:55 (UTC)
Goto Top
Moin,

sieh dir mal die Listview an.

Gruß
Mitglied: 6247018886
Solution 6247018886 Apr 12, 2023 at 11:25:33 (UTC)
Goto Top
bsp.

screenshot

<Window x:Class="ListFilesWPF.MainWindow"  
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
        xmlns:local="clr-namespace:ListFilesWPF"  
        mc:Ignorable="d"  
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">  
    <Grid>
        <ListView x:Name="lv" Margin="10">  
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=Name}" Width="200">  
                        <GridViewColumnHeader Click="GridViewColumnHeader_Click">Name</GridViewColumnHeader>  
                    </GridViewColumn>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=LastWriteTime,StringFormat='dd.MM.yyyy HH:mm:ss'}" Width="150">  
                        <GridViewColumnHeader Click="GridViewColumnHeader_Click">LasttWriteTime</GridViewColumnHeader>  
                    </GridViewColumn>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=CreationTime,StringFormat='dd.MM.yyyy HH:mm:ss'}" Width="150">  
                        <GridViewColumnHeader Click="GridViewColumnHeader_Click">CreationTime</GridViewColumnHeader>  
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.IO;
using System.ComponentModel;

namespace ListFilesWPF {
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window {
        GridViewColumnHeader _lastHeader = null;
        ListSortDirection _lastDir = ListSortDirection.Ascending;
        private FileInfo[] files;

        public MainWindow() {
            InitializeComponent();
        }
        
        private void Window_Loaded(object sender, RoutedEventArgs e) {
            files = new DirectoryInfo(@"D:\MyFolder").GetFiles("*.pdf");  
            lv.ItemsSource = files;
        }
        
        private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e) {
            var headerClicked = e.OriginalSource as GridViewColumnHeader;
            var columnBinding = headerClicked.Column.DisplayMemberBinding as Binding;
            _lastDir = (_lastDir == ListSortDirection.Ascending) ? ListSortDirection.Descending : ListSortDirection.Ascending;
            if(_lastHeader != headerClicked) {
                _lastDir = ListSortDirection.Ascending;
            }
            CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lv.ItemsSource);
            view.SortDescriptions.Clear();
            view.SortDescriptions.Add(new SortDescription(columnBinding.Path.Path, _lastDir));
            _lastHeader = headerClicked;
        }
    }
}
Cheers briggs