我有一个UserControl,它基本上只包含一个DataGrid。
在这个DataGrid中,我有一个事件列表(Severity - Date - Message)。
用户控件通过ViewModelLocator
的{{1}}绑定。
我添加了两件事:
在我的UserControl资源中:
MVVMLight Toolkit
由DataGrid使用:
<UserControl.Resources>
<CollectionViewSource x:Key="SortedEvents" Source="{Binding Events}">
<CollectionViewSource.SortDescriptions>
<componentModel:SortDescription PropertyName="EventTime" Direction="Descending"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</UserControl.Resources>
我还在<DataGrid ItemsSource="{Binding Source={StaticResource SortedEvents}}" AutoGenerateColumns="False" >
上设置了SortedDirection
:
DataGridTextColumn.SortDirection
当我检查设计器时,我看到显示DataGrid正确排序的小箭头。
但是当我启动应用程序时,列表没有排序,箭头不在这里。如果我单击列对其进行排序,它会对所有内容进行正确排序,它只是默认值,似乎不起作用。
我错过了什么? (这个dataGrid /列甚至没有命名,所以我不能尝试通过别的东西来编辑它们。)
(最初我只在<DataGridTextColumn Binding="{Binding EventTime}" Header="Time" IsReadOnly="True" SortDirection="Descending"/>
上有SortDirection
。同样的结果)
答案 0 :(得分:2)
关于&#34;小箭头&#34;点击这里: ColumnHeader arrows not reflected when sorting a DataGrid in XAML
对于更复杂的答案:Pre-sorting a DataGrid in WPF
我认为主要部分是:
注意:&#34; scm&#34;名称空间前缀映射到System.ComponentModel其中 SortDescription类存在。
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
修改强>
DataGrid会在其ItemsSource更改时删除SortDescriptions和GroupDescriptions。这是必要的,因为与其他ItemsControl不同,DataGrid本身在用户单击列标题时添加SortDescriptions,如果它们与新的ItemsSource不兼容,则可能会崩溃。
protected override void OnItemsSourceChanged(IEnumerable oldValue, IEnumerable newValue)
{
if (SetupSortDescriptions != null && (newValue != null))
SetupSortDescriptions(this, new ValueEventArgs<CollectionView>((CollectionView)newValue));
base.OnItemsSourceChanged(oldValue, newValue);
}
答案 1 :(得分:0)
您似乎只需要将 IsLiveSortingRequested="True" 添加到 CollectionViewSource。
<UserControl.Resources>
<CollectionViewSource x:Key="SortedEvents" Source="{Binding Events}" IsLiveSortingRequested="True">
<CollectionViewSource.SortDescriptions>
<componentModel:SortDescription PropertyName="EventTime" Direction="Descending"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</UserControl.Resources>
这对我有用