Проблема в использовании SortDescription в WPF - int и string не IComparable? - PullRequest
2 голосов
/ 02 декабря 2010

У меня проблема с использованием SortDescription.Я нашел некоторую ветку о проблеме, например, если вы хотите отсортировать по типу, который не реализует IComparable, например по классу, определенному пользователем, но это не мой случай.

У меня есть класс, которыйимеет два свойства: идентификатор строки и значение типа int.Давайте назовем это Item!И у меня есть представление:

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

1 голос
/ 02 декабря 2010

Это прекрасно работает для меня, поэтому вы делаете что-то не так в других частях своего кода.Сравните то, что вы делаете с образцом ниже.

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;
        }
    }
}
0 голосов
/ 02 декабря 2010

Это тип времени выполнения элементов в столбцах, по которым вы сортируете. Свойства ID и Value должны оба быть типами, получающими IComparable.

Я предполагаю, что вы не пытаетесь сделать что-то умное и помещаете разные типы среды выполнения со свойствами с именами ID и Value в список элементов. Вы можете использовать WPF для создания таких динамических вещей, но это один из примеров того, как он падает.

Струнный инструмент IComparable http://msdn.microsoft.com/en-us/library/system.string.aspx

0 голосов
/ 02 декабря 2010

Я не знаю, относится ли это к делу, но я получил ту же ошибку в DataGridView при попытке сортировки столбца, и это было причиной:

Значение ячейки должно быть того же типа для сравнения. Если у вас есть три строки, и в двух из них у вас есть значения одного и того же типа, но у другой строки нет значения, он не может сравнить его, если две строки, имеющие значение, были установлены для объекта в качестве значения для ячейки в строке, которая не имеет значения, будет пустая строка. Для сортировки вам нужно будет установить значение в виде строкового значения для всей ячейки в столбце, который вы сортируете.

...