2010-12-02 3 views
2

Ich habe ein Problem mit der Verwendung von SortDescription. Ich habe einen Thread zu dem Problem gefunden, etwa wenn Sie nach einem Typ sortieren möchten, der IComparable nicht implementiert, wie eine benutzerdefinierte Klasse, aber das ist nicht mein Fall.Problem bei der Verwendung von SortDescription in WPF - int und string sind nicht IComparable?

Ich habe eine Klasse, die zwei Eigenschaften hat: String-ID und int-Wert. Nennen wir es Item! Und ich habe einen Blick:

<UserControl> <!-- ... --> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 

     <Button Click="Button_Click" 
       Content="Sort by ID" 
       Grid.Row="0"/> 
     <Button Click="Button_Click1" 
       Content="Sort by Value" 
       Grid.Row="1"/> 
     <DockPanel Grid.Row="2"> 
      <ItemsControl x:Name="mItemsControl" 
          ItemsSource="{Binding Items}"><!-- The type of Items is ObservableCollection<Item> --> 
       <!-- ... --> 
      </ItemsControl> 
     </DockPanel> 
    </Grid> 
</GroupBox> 

Eventhandler wie diese sind: „Fehlgeschlagen zwei Elemente im Array vergleichen“

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     mItemsControl.Items.SortDescriptions.Add(new SortDescription("ID", ListSortDirection.Ascending); //Exception here 
    } 
private void Button_Click1(object sender, RoutedEventArgs e) 
    { 
     mItemsControl.Items.SortDescriptions.Add(new SortDescription("Value", ListSortDirection.Ascending); //...and here as well 
    } 

ich InvalidOperationException bekommen, weil es, und es ist, weil weder von Die Elemente implementieren IComparable. Und das ist, was ich nicht verstehen kann, wie ich Intarsien, sowie Strings vergleichen kann.

Vielen Dank für eine Idee!

Antwort

1

Das funktioniert gut für mich, damit Sie in anderen Teilen Ihres Codes etwas falsch machen. Vergleichen Sie, was Sie mit unten Beispiel tun.

XAML:

<Window x:Class="SortDemo.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <Button Click="OnSort" Content="Sort by ID" Tag="ID"/> 
     <Button Click="OnSort" Content="Sort by Value" Tag="Value"/> 
     <ItemsControl Name="_itemsControl" ItemsSource="{Binding Path=Items}" /> 
    </StackPanel> 
</Window> 

-Code hinter:

using System; 
using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Windows; 

namespace SortDemo 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      Items = new ObservableCollection<Item>(); 
      Items.Add(new Item() { ID = "AAA", Value = 2 }); 
      Items.Add(new Item() { ID = "BBB", Value = 1 }); 

      DataContext = this; 
     } 

     public ObservableCollection<Item> Items { get; private set; } 

     private void OnSort(object sender, RoutedEventArgs e) 
     { 
      string sortProperty = (sender as FrameworkElement).Tag as string; 
      _itemsControl.Items.SortDescriptions.Clear(); 
      _itemsControl.Items.SortDescriptions.Add(new SortDescription(sortProperty, ListSortDirection.Ascending)); 
     } 
    } 

    public class Item 
    { 
     public string ID { get; set;} 
     public int Value { get; set; } 

     public override string ToString() 
     { 
      return ID + " " + Value; 
     } 
    } 
} 
+0

Ich bin ein Lügner. Ich war zu ungenau mit meinem Beispiel. mItemsControl.Items.SortDescriptions.Add (this.IDDescending); war, dass ich verwendet habe, wo IDAscending Getter eine neue SortDescription ("ID", ListSortDirection.Descending) erstellt, aber wie ich herausgefunden habe, war der Wert, der auf diese Weise erhalten wurde, eine Art von Standard-Sortierbeschreibung. Die Richtung war aufsteigend und PropertyName war null. (Ich habe diese Lösung verwendet, um genaue Sortierbeschreibungen hinzufügen und entfernen zu können.) Ich weiß nicht warum, aber das sollte die Antwort sein. – ike

0

Ich weiß nicht, ob dies relevant ist, aber ich erhielt den gleichen Fehler auf einem Datagridview, wenn einen colum zu sortieren versuchen, und das war der Grund:

Der Wert der Zelle muss von der gleichen Art damit es verglichen wird. Wenn Sie drei Zeilen haben und in zweien der Zeile Werte desselben Typs haben, aber die andere Zeile keinen Wert hat, kann sie nicht verglichen werden, wenn die zwei Zeilen, deren Wert auf ein Objekt gesetzt wurde, als Wert für die Zelle verwendet werden in der Zeile, die keinen Wert hat, wird eine leere Zeichenfolge sein. Um zu sortieren, müssen Sie den Wert als Zeichenfolge für alle Zellen in der Spalte festlegen, die Sie sortieren.

0

Seine in dem Laufzeittyp der Elemente in den Spalten, die Sie durch die Sortierung werden. Die Eigenschaften ID und Wert müssen beide Typen sein, die IComparable ableiten.

Ich gehe davon aus, dass Sie nicht versuchen, etwas Cleveres zu tun und verschiedene Runtime-Typen mit den Eigenschaften ID und Value in die Items-Liste zu setzen. Sie können WPF verwenden, um dynamische Dinge wie das zu tun, aber dies ist ein Beispiel dafür, wo es fallen wird.

String implementieren IComparable http://msdn.microsoft.com/en-us/library/system.string.aspx

Verwandte Themen