2010-12-02 3 views
2

SortDescription 사용에 문제가 있습니다. 사용자 정의 클래스와 같은 IComparable을 구현하지 않는 형식으로 정렬하려는 경우처럼 문제에 대한 일부 스레드를 찾았습니다.하지만 제 경우는 아닙니다.WPF에서 SortDescription을 사용할 때의 문제 - int와 string은 IComparable이 아닙니까?

클래스에는 두 가지 속성 (문자열 ID 및 int 값)이 있습니다. 그것을 Item이라고 부르 자! 이 때문에

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이 얻을, 그것은의도 때문이다 "배열의 두 요소를 비교하지 못했습니다."

<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 다음과 같다 : 는 그리고 전망을 요소는 IComparable을 구현합니다. 그리고, 내가 이해할 수없는 것은, int와 문자열을 비교할 수 있기 때문입니다.

아무쪼록 감사드립니다.

답변

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

나는 거짓말 쟁이입니다. 나는 내 모범을 너무 부정확했다. mItemsControl.Items.SortDescriptions.Add (this.IDDescending); IDAscending의 getter가 새로운 SortDescription ("ID", ListSortDirection.Descending)을 만드는 곳에서 사용했지만,이 방법으로 얻은 값은 일종의 기본 Sortdescription입니다. 방향이 오름차순이고 PropertyName이 null입니다. (정확한 정렬 설명을 추가하고 제거 할 수있는 솔루션을 사용했습니다.) 이유는 모르겠지만이 응답이 답글입니다. – ike

0

이 관련된 경우 나도 몰라,하지만 콜 럼을 정렬하는 노력이는 이유 때 내가있는 DataGridView에서 같은 오류가 발생 :

해야 동일한 유형의에 의해 셀의 값 그것이 비교되기 위해서. 3 개의 행이 있고 2 개의 행에 동일한 유형의 값이 있지만 다른 행에 값이없는 경우 셀에 대한 값으로 객체에 값이 설정된 두 행을 비교하면 비교할 수 없습니다 값이없는 행의 문자열은 빈 문자열이됩니다. 정렬을 위해서는 정렬 할 열의 모든 셀에 대해 값을 문자열 값으로 설정해야합니다.

0

그것. 속성 ID 및 값은 모두 IComparable을 파생하는 형식이어야합니다.

뭔가 똑똑한 일을하려고하지 않고 ID 및 Value라는 속성을 사용하여 다른 런타임 유형을 모두 항목 목록에 넣으려고하지 않는다고 가정합니다. WPF를 사용하여 이와 같은 역동적 인 일을 할 수 있지만, 이것이 떨어질 곳의 한 예입니다.

문자열 구현 IComparable http://msdn.microsoft.com/en-us/library/system.string.aspx

관련 문제