none
SortDescription Negative Zahlen! RRS feed

  • Frage

  • Hallo!

    Wenn ich meiner ICollectionView eine Sortdescription hinzufüge welche Zahlen enthält, dann wird nicht richtig sortiert. Beispiel einer Ausgabe:

    -1

    1

    2

    -3

    4

    5 usw.

    Wie man sieht werden Minus-Vorzeichen vollkommen ignoriert.... Kann ich das ändern?

    MfG

    Montag, 18. März 2013 15:11

Antworten

  • Hi,
    typgerechte Verarbeitung erfordert, dass Wert IMMER entsprechend ihrem Typ abgelegt werden. Während der Verarbeitung der Werte kann es im Sonderfall einfacher sein, diese Werte zu konvertieren. Für die übliche Verarbeitung ist dies aber nicht erforderlich. Lediglich für die Anzeige ist eine Umwandlung in darstellbare Zeichen notwendig.
     
    Im Programm sind alle Werte erst einmal Zeichenketten. Dem Compiler teilst Du aber mit, in welchen Typ er diese Zeichenketten zu konvertieren hat, um sie dann als typsichere Literale im Programm zu nutzen. Da braucht auch nichts geprüft zu werden. Das machen die Typprüfung des Compilers und später die Prüfungen der CLR. Eine Programmierung von String-Literalen mit Konvertierung und Prüfung im Programm ist nicht notwendig. Notwendig sind Prüfungen lediglich bei Benutzereingaben, da er nur Zeichenketten eingeben kann.
     
    --
    Peter Fleischer
    • Als Antwort markiert Flo0806 Freitag, 22. März 2013 09:42
    Dienstag, 19. März 2013 13:18

Alle Antworten

  • Hi,
    in Deinem Code muss ein Fehler sein. Ich kann das Problem nicht reproduzieren. Hier eine kleine Demo:

    XAML:

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
            xmlns:lokal="clr-namespace:WpfApplication1">
      <Window.Resources>
        <lokal:ViewModel x:Key="vm"/>
      </Window.Resources>
        <Grid DataContext="{Binding Source={StaticResource vm}}">
            <ListBox ItemsSource="{Binding View}" DisplayMemberPath="Zahl" />
        </Grid>
    </Window>
    

    Dazu der Code:

    Imports System.ComponentModel
    Imports System.Collections.ObjectModel
    
    Public Class ViewModel
    
      Private cvs As CollectionViewSource
    
      Public ReadOnly Property View As ICollectionView
        Get
          If cvs Is Nothing Then
            cvs = New CollectionViewSource
            cvs.Source = GetData()
            cvs.View.SortDescriptions.Add(New SortDescription("Zahl", ListSortDirection.Ascending))
          End If
          Return cvs.View
        End Get
      End Property
    
      Private Function GetData() As ObservableCollection(Of C1)
        Dim liste As New ObservableCollection(Of C1)
        liste.Add(New C1 With {.Zahl = 5})
        liste.Add(New C1 With {.Zahl = -4})
        liste.Add(New C1 With {.Zahl = 3})
        liste.Add(New C1 With {.Zahl = -2})
        liste.Add(New C1 With {.Zahl = 1})
        liste.Add(New C1 With {.Zahl = -1})
        Return liste
      End Function
    
      Public Class C1
        Public Property Zahl As Double
      End Class
    
    End Class
    

    --
    Viele Gruesse
    Peter

    Montag, 18. März 2013 19:03
  • Hallo, Liegt anscheinend daran da ich den Zahlenwert als String übergebe. Dies wird von vielen im MVVM Pattern so empfohlen. Da ich einen ListviewColumnSort Behavior nutze und die Sortierung nicht direkt von der ObservableCollection aus durchführen kann, welche Möglichkeit bleibt mir? MfG flo
    Montag, 18. März 2013 19:45
  • Hi,

    mit der nicht typgerechten Speicherung von Zahlen als String hast Du etwas missverstanden. Ich kann mir nicht vorstellen, dass jemand so etwas empfiehlt.

    In meinem Beispiel wird nicht die ObservableCollection sortiert, sondern der Zugriff über die Sicht stellt die Elemente sortiert zur Anzeige bereit. In Deinem Ausgangsposting hast Du genau dasselbe beschrieben.

    Vielleicht solltest Du etwas genauer beschreiben, was Du gemacht hast und warum.

    --
    Peter

    Montag, 18. März 2013 20:51
  • Ich meinte gelesen zu haben dass man für Validation (IDataErrorInfo) am besten strings zur kontrolle bereit stellt. Es funktioniert soweit aber auch mit decimal usw..

    Wenn ich mein Model schreibe, schrieb ich alle Werte im String-Format, und konvertierte Sie dann zur Kontrolle um.

    Ist es also "richtiger" diese Werte gleich als Zahlenwert zu schreiben?

    MfG

    Dienstag, 19. März 2013 09:14
  • Hi,
    typgerechte Verarbeitung erfordert, dass Wert IMMER entsprechend ihrem Typ abgelegt werden. Während der Verarbeitung der Werte kann es im Sonderfall einfacher sein, diese Werte zu konvertieren. Für die übliche Verarbeitung ist dies aber nicht erforderlich. Lediglich für die Anzeige ist eine Umwandlung in darstellbare Zeichen notwendig.
     
    Im Programm sind alle Werte erst einmal Zeichenketten. Dem Compiler teilst Du aber mit, in welchen Typ er diese Zeichenketten zu konvertieren hat, um sie dann als typsichere Literale im Programm zu nutzen. Da braucht auch nichts geprüft zu werden. Das machen die Typprüfung des Compilers und später die Prüfungen der CLR. Eine Programmierung von String-Literalen mit Konvertierung und Prüfung im Programm ist nicht notwendig. Notwendig sind Prüfungen lediglich bei Benutzereingaben, da er nur Zeichenketten eingeben kann.
     
    --
    Peter Fleischer
    • Als Antwort markiert Flo0806 Freitag, 22. März 2013 09:42
    Dienstag, 19. März 2013 13:18
  • Hallo Genau so habe ich es auch, die benutzereinfabe im View wird im Viewmodel als String behandelt und dann Typgerecht ans Model übergeben. So meinst du oder? Jetz habe ich es im Viewmodel bereits Typgerecht gespeichert und mit IDataErrorInfo und zusätzlich ValidationRule überprüfe ich die Werte. Das läuft auch wunderbar! So werden eingabefehler wie Buchstaben in einem INT Wert auch abgefangen. So korrekt? MfG
    Dienstag, 19. März 2013 20:00
  • Hi Flo,

    ich denke das Peter eher meint, das die View den Entsprechenden Datentyp schon kennt.

    Wenn ich einen Datetimepicker habe, bekomme ich ja auch ein Datum ;).

    MFG

    Björn

    Dienstag, 19. März 2013 21:08
  • Hallo,

    ja, klingt auch logisch! :-)

    Dann werde ich wohl diesen Weg nehmen und meine TextBoxen zu Numeric-TextBoxen ummodeln, somit wäre das Problem gelöst!

    MfG

    Mittwoch, 20. März 2013 08:43