WPF DataGrid默认排序不起作用

教授

我有一个DataGrid,具有XAML这样的列:

<DataGridTextColumn Header="Time" Binding="{Binding Date, StringFormat='yyyy-MM-dd  HH:mm:ss'}" SortMemberPath="Date" SortDirection="Descending" Width="130" CanUserResize="True" />
<DataGridTextColumn Header="Level" Binding="{Binding Level}" Width="60" CanUserResize="True" />
<DataGridTextColumn Header="Source" Binding="{Binding Logger}" Width="150" CanUserResize="True" />
<DataGridTextColumn Header="Message" Binding="{Binding Message}" Width="*" CanUserResize="True" />

我将此绑定到ObservableCollection<EalsLogEvent>,在其中EalsLogEvent.Date键入DateTime

public ObservableCollection<EalsLogEvent> LogEvents 
{
    get
    {
        return _logEvents;
    }
}

网格视图模型使用计时器来刷新自身,并且在应用程序启动时,除了第一次加载时,网格的一切似乎都很好。然后,该Time列似乎是降序排列,但升序排列。

为了获得正确的排序,我必须单击列标题两次;第一次将顺序更改为升序,现在与列的内容匹配。在列标题上的第二次单击将其排序顺序改回降序,这一次它将对列的内容进行正确的排序,即降序排列。

如果我使用LINQ_logEvents在刷新时对集合进行排序,那么我将失去用户通过单击列标题为该列设置的任何顺序。如果我必须让视图告诉模型LINQ排序应该使用哪个顺序,那有什么不好的味道。

动力类

您可以CollectionViewSource在XAML中使用来定义默认排序。

假设我们有一个视图模型:

public class ViewModel : INotifyPropertyChanged
{
    public ObservableCollection<Item> Items { get; private set; }
}

我们可以CollectionViewItems集合创建一个自定义

<Window xmlns:l="clr-namespace:YourNamespace"
        xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase">
    <Window.DataContext>
        <l:ViewModel/>
    </Window.DataContext>
    <Window.Resources>
        <CollectionViewSource Source="{Binding Items}" x:Key="GridItems">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription PropertyName="Date" Direction="Descending"/>
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>
    </Window.Resources>
    <DataGrid ItemsSource="{Binding Source={StaticResource GridItems}}" AutoGenerateColumns="False">
        <DataGrid.Columns>                    
            <DataGridTextColumn Header="Time" Binding="{Binding Date, StringFormat='yyyy-MM-dd  HH:mm:ss'}" Width="130" CanUserResize="True" />
            <DataGridTextColumn Header="Level" Binding="{Binding Level}" Width="60" CanUserResize="True" />
            <DataGridTextColumn Header="Source" Binding="{Binding Logger}" Width="150" CanUserResize="True" />
            <DataGridTextColumn Header="Message" Binding="{Binding Message}" Width="*" CanUserResize="True" />
        </DataGrid.Columns>
    </DataGrid>
</Window>

使用这种方法,您的基础源集合(Items在此示例中)将不会受到影响,排序仅在视图中进行。

如您在MSDN中所读

您可以将集合视图视为绑定源集合顶部的一层,该视图使您可以基于排序,过滤和分组查询来导航和显示该集合,而无需操纵基础源集合本身。如果源集合实现INotifyCollectionChanged接口,则CollectionChanged事件引发的更改将传播到视图。

您还应该注意以下几点:

所有集合都有一个默认的CollectionView。WPF始终绑定到视图而不是集合。如果直接绑定到集合,则WPF实际上会绑定到该集合的默认视图。

因此,使用CollectionViewSource,您只是为集合定义了一个自定义视图。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章