c# - WPF中具有列排序的ListView

标签 c# wpf xaml mvvm

这实际上是一个通用的ListView,在应用程序的许多部分中都可以看到不同的数据(我不知道它将包含哪些数据以及它将包含多少列),现在它可以正常工作,但是用户应该能够通过单击ListView控件的标题对每个列进行排序,而我不知道如何添加该排序功能。

这是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>

这是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();
    }
}

知道我该怎么做吗?

最佳答案

  • 设置一个GridViewColumnHeader,如下所示:
    <GridViewColumn DisplayMemberBinding="{Binding Address}">
       <GridViewColumnHeader Content="Address" Click="GridViewColumnHeader_Click"/>
    </GridViewColumn>
    

    代码隐藏
      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();
        }
    
  • 指定一个HeaderTemplate,以便您可以处理MouseDownEvent







  • 然后,您必须使用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();
     }
    

    动态添加列:
                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
                });
    

    关于c# - WPF中具有列排序的ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34689056/

    相关文章:

    c# - WPF 将项目添加到绑定(bind)到 observablecollection 异常的数据网格

    c# - 创建 System.Windows.Controls.Image 会引发异常 - 如何使用调度程序实例化它?

    c# - WPF 如何在文本框中使用验证规则而不创建额外的属性以绑定(bind)到对话框中?

    C# + 代码契约 - 抛出异常

    wpf - 如何从资源中获取BitmapImage?

    c# - 在 Startup.cs 中使 ConfigureServices 方法异步

    c# - 在 WPF 中从一个窗口切换到另一个窗口并使其处于事件状态

    c# - 选项卡更改时刷新/重新加载 MUI WPF 页面

    c# - 您如何满足 WebApi 查询字符串中的 AND 和 OR 搜索?

    c# - 如何解码使用 encodeURIComponent() 在 JS 中编码的 HTML?