ОШИБКА сортировки wpf datagrid icollectionview?

может быть, кто-то может мне помочь? У меня есть следующий сценарий:

  1. Простой вид:

    <Window x:Class="DataGridSortBug.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          Title="MainWindow" Height="350" Width="525">
        <DockPanel>
            <StackPanel DockPanel.Dock="Top">
                <Button Click="Button_Click">Refresh</Button>
            </StackPanel>
    
            <DataGrid ItemsSource="{Binding View}" />
       </DockPanel>
    </Window>
    
  2. Код позади:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
    
            DataContext = new ViewModel();
        }
    
        public class TestItem
        {
            private int _sequence;
            public int Sequence
            {
                get { return _sequence; }
            }
    
            public TestItem(int sequence)
            {
                _sequence = sequence;
            }
        }
    
        public class ViewModel
        {
            ObservableCollection<TestItem> _collection;
    
            private ICollectionView _view;
            public ICollectionView View
            {
                get { return _view; }
            }
    
            public ViewModel()
            {
                _collection = new ObservableCollection<TestItem>();
                _collection.Add(new TestItem(5));
                _collection.Add(new TestItem(2));
                _collection.Add(new TestItem(4));
                _collection.Add(new TestItem(3));
                _collection.Add(new TestItem(1));
    
                _view = CollectionViewSource.GetDefaultView(_collection);
                _view.SortDescriptions.Add(new SortDescription("Sequence", ListSortDirection.Ascending));
            }
    
    
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            DataContext = new ViewModel();
        }
    }
    

После запуска программы датасет содержит (как и ожидалось):

1
2
3
4
5

После нажатия на кнопку:

5
2
4
3
1

Но я действительно не могу понять, почему. Я что-то не так делаю или это баг? И если это баг, то есть обходной путь?


person Daniel Bişar    schedule 30.05.2011    source источник
comment
connect.microsoft.com/ WPF/обратная связь/детали/671505/   -  person Daniel Bişar    schedule 31.05.2011
comment
Довольно старая ветка... но никогда не поздно добавить решение/обходной путь, не так ли? Что ж, я столкнулся с той же проблемой, и вот мое решение: .com/questions/11177351/   -  person Hendrik Wiese    schedule 26.06.2012


Ответы (3)


Я только что столкнулся с этой ошибкой. (Или, по крайней мере, я предполагаю, что это ошибка).

При отладке видно, что коллекция SortDescriptions очищается после назначения ViewModel контексту данных.

В качестве обходного пути я удалил SortDescriptions из CTOR ViewModel и поместил их в общедоступный метод, который затем вызываю после назначения ViewModel в DataContext.

private void Button_Click(object sender, RoutedEventArgs e)
{
    var model = new ViewModel();
    DataContext = model;  // SortDescriptions collection is cleared here.
    model.AddSortDescriptions();
    model.View.Refresh();
}

Это далеко не идеально, однако это, кажется, единственный обходной путь, который я смог найти.

person Kizedek    schedule 25.08.2011

Попробуйте позвонить

_view.Refresh(); 

после добавления SortDescription.

person Chris Shain    schedule 23.08.2011

Ваш TestItem не реализует интерфейс IComparable, поэтому он не уверен, с чем сравнивать ваши объекты.

MSDN IComparable

В основном вам нужно добавить это в свой класс ниже.

public class TestItem  : IComparable
{
    private int _sequence;
    public int Sequence
    {
        get { return _sequence; }
    }

    public TestItem(int sequence)
    {
        _sequence = sequence;
    }

   public int CompareTo(object obj) 
   {
     if (obj == null) 
          return 1;
     // put comparison logic here
    }
person tsells    schedule 23.08.2011
comment
В OP говорится, что сортировка сработала при первом создании представления, поэтому это не имеет смысла. - person Aaron; 26.01.2016