我希望在启动时指定默认排序,但仍然允许用户通过单击列标题进行排序。遗憾的是,当SortDirection属性被设置时,它被忽略了--也就是说,我们得到了正确的列标题箭头,但是没有排序。
手动单击标题,会正确地对数据进行排序,因此这不是排序本身。这是我使用的简化版本:
<DataGrid ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=CurrentView}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Header 1" Binding="{Binding ApplicationName}"/>
<DataGridTextColumn Header="Header 2"
Binding="{Binding TotalTime}" SortDirection="Descending"/>
</DataGrid.Columns>
</DataGrid>更新:我还尝试按照建议将SortDescriptions添加到ICollectionView中,但没有得到好的结果。这是否与我正在向集合中动态添加新项有关?也就是说,在启动时,列表是空的,填充缓慢,也许sortdescription只应用了一次?
发布于 2011-12-19 10:03:48
看一下这个MSDN Blog
从上面的链接:
DataGridColumn.SortDirection实际上并不对列进行排序。
DataGridColumn.SortDirection用于将DataGridColumnHeader中的可视箭头排列为向上、向下或不显示。要对列进行实际排序而不是单击DataGridColumnHeader,可以通过编程方式设置DataGrid.Items.SortDescriptions。
发布于 2011-12-19 10:03:01
我对此没有任何个人经验,但我找到了this rather helpful article。
本质上,您需要将SortDescription添加到DataGrid绑定到的CollectionViewSource中。
发布于 2012-02-07 06:12:27
这篇文章非常有帮助。我能够使用它来找到一个比较简单的解决方案。以下是我的解决方案的一小段工作。
XAML
<DataGrid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
AutoGenerateColumns="False" ItemsSource="{Binding LogLister.Logs}"
IsReadOnly="True" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding TimeStampLocal}" Header="Time" x:Name="ColTimeStamp" />
<DataGridTextColumn Binding="{Binding Text}" Header="Text"/>
</DataGrid.Columns>
</DataGrid>代码
// Using a DependencyProperty as the backing store for ViewModel. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ViewModelProperty =
DependencyProperty.Register("ViewModel", typeof(LogViewerViewModel), typeof(LogViewerControl),
new UIPropertyMetadata(null,pf_viewModelChanged));
private static void pf_viewModelChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
var control = (LogViewerControl)o;
control.ColTimeStamp.SortDirection = ListSortDirection.Descending;
var vm = e.NewValue as LogViewerViewModel;
if (vm != null)
{
ICollectionView collectionView = CollectionViewSource.GetDefaultView(vm.LogLister.Logs);
collectionView.SortDescriptions.Add(new SortDescription("TimeStampLocal", ListSortDirection.Descending));
}
}https://stackoverflow.com/questions/8556302
复制相似问题