2009-08-03 19 views
0

Ich arbeite eine sortierbare WPF ListView und ich habe bereits eine Menge Fortschritte gemacht. Es ist nicht so schwer, da es bereits eine Menge Zeug im Internet gibt. Aber es gibt ein paar Informationen, die ich noch vermisse.Sortieren WPF ListView mit einem DataTemplate anstelle von DisplayMemberBinding

mit einer Säule wie folgt aus:

<GridViewColumn Width="200" Header="Fahrzeugname" DisplayMemberBinding="{Binding Name}"> 

ich es wie folgt sortieren:

Binding columnBinding = column.DisplayMemberBinding as Binding; 

if (columnBinding != null) 
{ 
    sorts.Clear(); 
    sorts.Add(new SortDescription(columnBinding.Path.Path, direction)); 
    lastColumnSorted = column; 
} 

Aber mein Problem ist, ich, da ich eine DataTemplate verwenden keine DisplayMemberBinding haben:

Wie bekomme ich die Binding Eigenschaft für r diese Spalte im C# -Code?

Antwort

2

schrieb ich eine Reihe von angefügten Eigenschaften genau das zu tun, was Kent vorgeschlagen, können Sie es aus here

überprüfen

EDIT: wie gewünscht, hier ist ein Beispiel eines Befehls für GridViewSort.Command:

private ICommand _sortCommand; 
    public ICommand SortCommand 
    { 
     get 
     { 
      if (_sortCommand == null) 
      { 
       _sortCommand = new RelayCommand(SortPersonsBy); 
      } 
      return _sortCommand; 
     } 
     set { _sortCommand = value; } 
    } 

    private void SortPersonsBy(object param) 
    { 
     string propertyName = param as string; 
     ICollectionView view = CollectionViewSource.GetDefaultView(_persons); 
     ListSortDirection direction = ListSortDirection.Ascending; 
     if (view.SortDescriptions.Count > 0) 
     { 
      SortDescription currentSort = view.SortDescriptions[0]; 
      if (currentSort.PropertyName == propertyName) 
      { 
       if (currentSort.Direction == ListSortDirection.Ascending) 
        direction = ListSortDirection.Descending; 
       else 
        direction = ListSortDirection.Ascending; 
      } 
      view.SortDescriptions.Clear(); 
     } 
     if (!string.IsNullOrEmpty(propertyName)) 
     { 
      view.SortDescriptions.Add(new SortDescription(propertyName, direction)); 
     } 
    } 

(es implementiert tatsächlich das gleiche Verhalten als wenn GridViewSort.AutoSort auf True festgelegt ist)

+0

Großer Artikel! Ein Beispiel für den GridViewSort.Command wäre in Ordnung. Da ich mit diesem Thema nicht so erfahren bin. – TalkingCode

+0

Ich habe meine Antwort aktualisiert, um das Beispiel hinzuzufügen –

+0

Danke, ich werde das untersuchen. – TalkingCode

0

Warum würden Sie dies automatisch versuchen? Warum nicht eine angefügte Eigenschaft bereitstellen, die Benutzer festlegen können, um die Eigenschaft zu diktieren, nach der die Spalte sortiert werden soll?

<GridViewColumn s:SortableColumn.SortBy="{Binding Name}" ...> 

So bieten Sie mehr Freiheit der Implementierung, und der Code wird schneller und robuster sein.

0

der WPF integrierte w ay wäre die ICollectionView zu verwenden.

ICollectionView view = CollectionViewSource.GetDefaultView(yourItemsSourceList); 
if(view.CanSort) 
{ 
    view.SortDescriptions.Add(...) 
} 
0

Ich bin vor ein ähnliches WPF Listview/Gridview Sortierung Problem und ich habe einige contraints was es schwierig macht, sofern die CSharp-Lösungen zu implementieren. Im Wesentlichen habe ich eine vorhandene ASP.NET-Anwendung mit Tausenden von Zeilen debugged VB-Code sowie SQL für eine Datenbank mit über 100 Tabellen und einigen sehr komplexen Verknüpfungen. Ich muss eine Windows .exe basierend auf der gleichen Anwendung schreiben, aber ich möchte WPF verwenden, um ein ähnliches grafisches Aussehen & Gefühl zu implementieren.

Nachdem ich mit dem Disclaimer fertig war, stieß ich auf das Sortierproblem und durchsuchte das Internet nach all den großartigen gemeinsamen Konzepten wie den obigen und versuchte, sie von CS in VB zu konvertieren. Ich bin ein erfahrener Programmierer, aber ich stellte fest, dass dies einfach außerhalb meiner Reichweite lag, also wandte ich mich anderswo um und entwickelte stattdessen meine eigene Sorte. Es wird wahrscheinlich die Puristen entsetzen, aber ich bin ein Pragmatiker und die Herstellung einer kommerziellen Anwendung hat Vorrang.

Um das Raster zu sortieren, entschied ich mich, nur die Mausereignisse in den Spaltenüberschriften zu verwenden. DoubleClick für Ascending-Sortierungen und MouseRightButtonUp für Absteigend.

<GridViewColumn Header="Project Name &#160;&#160;" Width="300" > 

Private Sub ListViewGrid_MouseDoubleClick(
    ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles ListingDG.MouseDoubleClick 

    Try 
     Dim mouseHdrClick As String = DirectCast(DirectCast(e.OriginalSource, System.Object), System.Windows.Controls.TextBlock).Text 
     Dim SqlOrderBy As String = "" 

     Select Case UCase(mouseHdrClick.Trim) 
      Case UCase("Product Name") 
       SqlOrderBy = " ORDER BY Product_Name" 

ich nachladen Dann einfach die ListViewGrid die Variable SqlOrderBy Zeichenfolge verwendet wird.Das einzige Problem, auf das ich stieß, war, dass ich gezwungen wurde, auf den Header-Text in der Spaltenüberschrift zu klicken, damit es funktionierte. Ich habe das gelöst, indem ich einfach das XML-Leerzeichen (&#160;) angehängt habe, um die Spaltenbreite zu füllen. Der Befehl .Trim löscht sie wieder, damit Select Case funktioniert. Ich habe immer noch nicht herausgefunden, wie man die kleinen Pfeile nach oben und nach unten fügt, aber die Funktionalität ist wichtig, da es sich gerade um kosmetische Details handelt.

<GridViewColumn Header="Project Name &#160;&#160;" Width="300"> 

lassen Sie mich schließlich hinzufügen, dass mir bewusst ist, dass, wenn ich die Gridview-Struktur ändern wird es der Kopftext verursacht an anderer Stelle im OriginalSource zu bewegen, aber das ist ein Problem, das ich mit jetzt leben kann. Ich weiß, dass dies eine schnelle & schmutzige Workaround ist und es gibt wahrscheinlich viel bessere Alternativen, so dass alle Empfehlungen geschätzt werden.

Verwandte Themen