问题描述
|
也许有人可以帮助我?我有以下情况:
一个简单的视图:
<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
}