2009-08-18 9 views
0

Weiß jemand, warum ich ein Nullreference Expception an folgenden Zeile bekommen:C#/WPF: ListView Sortierung: NullReference Exception beim Sortieren von Doppel/Dezimalzahlen, aber nicht für Strings?

var field = (string)((Binding)((GridViewColumnHeader)e.OriginalSource).Column.DisplayMemberBinding).Path.Path; 

bei der Verwendung dieses Beispiels: http://www.switchonthecode.com/comment/reply/263/2980 (basierend auf: http://www.switchonthecode.com/tutorials/wpf-tutorial-using-the-listview-part-2-sorting)

Vielen Dank!

Cheers, Joseph

PS: Dies geschieht nur, wenn ich double/Dezimalzahlen bin Sortierung, nicht für Strings?

EDIT:

Ich habe das Problem gefunden. Dies ist, wie meine XAML wie folgt aussehen:

  <GridViewColumn Header="Double"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding TotalValues, Mode=OneWay, StringFormat=\{0:0\'0.00\}, Converter={StaticResource GridValueConverter}}" TextAlignment="Right" Width="auto"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Header="Comments" DisplayMemberBinding="{Binding Path=Comments, Mode=OneWay}" Width="auto"/> 

Das Problem hier ist, dass ich versuche, die DisplayMemberBinding zu bekommen, aber für die Doppel den ich bin mit einem Datatemplate .. Wer weiß, wie ich die Zeile ändern um es für jeden Spalte-Typ arbeiten zu lassen?

Antwort

0

Auf einen Blick sieht es so aus, als ob die Linie nur für Strings arbeiten sollte, da Sie sie vor dem Zuweisen in eine Zeichenkette umwandeln. Man könnte dies stattdessen tun:

object field = ((Binding)((GridViewColumnHeader)e.OriginalSource).Column.DisplayMemberBinding).Path.Path; 

, die keine NULL-Verweis Ausnahme ausgelöst wird (die durch die (string) abgegeben verursacht wird, wenn der Wert kein String). Wenn Sie als Guss verwenden würden, würden Sie nicht die Ausnahme bei Besetzung bekommen, aber das wird nicht für Werttypen arbeiten (und würde immer noch nur für String arbeiten), dh:

var field = (((Binding)((GridViewColumnHeader)e.OriginalSource).Column.DisplayMemberBinding).Path.Path as string); 

so mit dem Feld als Objekt Sie können field.GetType() verwenden, um mit typeof (string), typeof (double), ... zu vergleichen, um herauszufinden, um welchen Typ es sich handelt und was Sie sonst noch brauchen.

Verwandte Themen