WPF DataGrid:指定默认排序

时间:2015-04-16 09:16:36

标签: c# wpf sorting datagrid

我有一个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。同样的结果)

2 个答案:

答案 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>

这对我有用