WPF的DataGrid的icollectionview排序错误?

问题描述

| 也许有人可以帮助我?我有以下情况: 一个简单的视图:
<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>
后面的代码
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个 但是我真的不明白为什么。我是在做错什么还是错误?如果这是一个错误,是否有解决方法?     

解决方法

        我刚遇到这个错误。 (或者至少我认为这是一个错误)。 调试时,您可以看到将ViewModel分配给DataContext之后,SortDescriptions集合被清除了。 解决方法是,我从ViewModel的CTOR中删除了SortDescriptions,并将它们放在一个公共方法中,然后在将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();
}
这远非理想,但是这似乎是我能找到的唯一解决方法。     ,        尝试致电
_view.Refresh(); 
添加SortDescription之后。     ,        您的TestItem未实现IComparable接口,因此不确定通过什么比较对象。 MSDN I可比 基本上,您需要将此添加到下面的类中。
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
    }