一个简单的观点:
<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();
}
}
程序启动后,datagrid包含(按预期):
1
2
3
4
5
点击按钮后:
5
2
4
3
1
但我真的不明白为什么。我做错了什么或这是一个错误?如果这是一个错误,是否有解决方法?
答案 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接口,因此不确定要比较对象的内容。
基本上你需要在下面的课程中添加它。
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
}