简体   繁体   English

WPF中具有列排序的ListView

[英]ListView with column sorting in WPF

This is actually a generic ListView that will be visible in many parts of the application for different data (I don't know which data it will contain and how many columns it will have), now it works perfectly, but the user should be able to sort each column by clicking on the header of the ListView control, and I don't know how to add that sorting functionality. 这实际上是一个通用的ListView,在应用程序的许多部分中都可以看到不同的数据(我不知道它将包含哪些数据以及它将包含多少列),现在它可以正常工作,但是用户应该能够通过单击ListView控件的标题对每一列进行排序 ,而我不知道如何添加该排序功能。

This is the XAML code: 这是XAML代码:

<entityList:EntityList 
    Name="EntityList"
    BorderBrush="DarkSlateBlue"
    Visibility="{Binding IsResultsGridVisible, Converter={x:Static converters:BoolToVisibility.Instance}}"                                        
    ItemsSource="{Binding SearchEntities}"                           
    Style="{StaticResource EntityListStyle}"
    ItemsNumber="50"
    View="{Binding ColumnConfig, Converter={ x:Static converters:ConfigToGridViewConverter.Instance}}">
</entityList:EntityList>

And this is the C# code: 这是C#代码:

internal class ConfigToGridViewConverter : IValueConverter
{
    public static readonly ConfigToGridViewConverter Instance = new ConfigToGridViewConverter();

    private ConfigToGridViewConverter()
    {
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var config = value as ColumnConfig;
        var gridView = new GridView { AllowsColumnReorder = true };

        if (config == null)
        {
            return gridView;
        }

        foreach (var colCfg in config.Columns)
        {
            var binding = new Binding(colCfg.DataField);
            switch (colCfg.Type)
            {
                case AttributeType.Enumerated:
                    if (colCfg.CodeListType != null)
                    {
                        binding.Converter = CodeListIdToDisplayNameConverter.Instance;
                        binding.ConverterParameter = colCfg.CodeListType.Value;
                    }

                    break;

                case AttributeType.Boolean:
                    binding.Converter = BooleanWithUndefinedToLocalisedStringConverter.Instance;
                    break;

                case AttributeType.Date:
                    binding.Converter = DateToShortLocalisedStringConverter.Instance;
                    break;
            }

            var col = new GridViewColumn
            {
                Header = colCfg.Header, // Column headers will need to be localised either when initializing config or at GridView creation time
                DisplayMemberBinding = binding,

            };

            gridView.Columns.Add(col);
        }

        return gridView;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Any idea how could I do this? 知道我该怎么做吗?

  1. Set a GridViewColumnHeader as shown below : 设置一个GridViewColumnHeader,如下所示:

     <GridViewColumn DisplayMemberBinding="{Binding Address}"> <GridViewColumnHeader Content="Address" Click="GridViewColumnHeader_Click"/> </GridViewColumn> 

    Code-Behind 代码隐藏

      private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e) { GridViewColumnHeader colHeader = (GridViewColumnHeader)e.OriginalSource; string colName = colHeader.Content.ToString(); CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(LstView.ItemsSource); view.SortDescriptions.Add(new SortDescription(colName, ListSortDirection.Ascending)); view.Refresh(); } 
  2. Specify a HeaderTemplate so that you can handle MouseDownEvent . 指定HeaderTemplate以便可以处理MouseDownEvent

Then you have to use CollectionViewSource . 然后,您必须使用CollectionViewSource

 private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
 {
     string colName = ((TextBlock)sender).Text.ToString();
     CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(LstView.ItemsSource);
     view.SortDescriptions.Add(new SortDescription(colName, ListSortDirection.Ascending));

     view.Refresh();
 }

Adding columns dynamically : 动态添加列:

            GridView view = (GridView)LstView.View;
            GridViewColumnHeader colHeader = new GridViewColumnHeader() { Content = "Name" };
            colHeader.Click += colHeader_Click;
            view.Columns.Add(new GridViewColumn()
            {
                DisplayMemberBinding = new Binding("Name"),
                Header = colHeader
            });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM