wpf datagrid icollectionview排序BUG?

时间:2011-05-30 13:15:31

标签: wpf sorting 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();
        }
    }
    
  3. 程序启动后,datagrid包含(按预期):

      

    1
      2
      3
      4
      5

    点击按钮后:

      

    5
      2
      4
      3
      1

    但我真的不明白为什么。我做错了什么或这是一个错误?如果这是一个错误,是否有解决方法?

3 个答案:

答案 0 :(得分: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();
}

这远非理想,但这似乎是我能找到的唯一解决方法。

答案 1 :(得分:0)

尝试拨打

_view.Refresh(); 
添加SortDescription后

答案 2 :(得分:-1)

您的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
    }