在WPF中使用SortDescription的问题 - int和string不是IComparable?

时间:2010-12-02 16:55:36

标签: c# wpf sorting itemscontrol

我在使用SortDescription时遇到问题。我找到了一些关于这个问题的线索,比如你想按照一个没有实现IComparable的类型排序,比如用户定义的类,但不是我的情况。

我有一个类,它有两个属性:string ID和int Value。我们称之为物品! 我有一个观点:

<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>

EventHandlers是这样的:

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
    }

我得到InvalidOperationException,因为它“无法比较数组中的两个元素。”,这是因为这两个元素都没有实现IComparable。 那就是我无法理解的东西,因为我可以比较整数,以及字符串。

感谢您的任何想法!

3 个答案:

答案 0 :(得分:1)

这对我来说很好,所以你在代码的其他部分做错了。比较你对以下样本的处理方式。

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>

代码背后:

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;
        }
    }
}

答案 1 :(得分:0)

我不知道这是否相关,但是在尝试对列进行排序时,我在DataGridView上收到了同样的错误,这就是原因:

单元格的值必须与相同类型相同。如果你有三行并且在两行中你有相同类型的值,但另一行没有值,如果有两个有值的行已被设置为一个对象作为单元格的值,则它无法比较它在没有值的行中将是一个空字符串。为了排序,您必须为要排序的列中的所有单元格设置值作为字符串值。

答案 2 :(得分:0)

它在您要排序的列中的项目的运行时类型中。属性ID和值必须都是导出IComparable的类型。

我假设你没有尝试做一些聪明的事情并且将不同的运行时类型都用名为ID和Value的属性放入Items列表中。你可以使用WPF来做这样的动态事情,但这是它落在哪里的一个例子。

字符串实现IComparable http://msdn.microsoft.com/en-us/library/system.string.aspx