如何将特殊项添加到列表视图并将其保留在顶部

本文关键字:视图 顶部 列表 保留 添加 | 更新日期: 2023-09-27 18:06:20

我有一个SortableListView,我通过绑定设置了ItemsSource。如下所示:

  <SortableListView ItemsSource="{Binding Items}">
    <SortableListView.View>
      <GridView>
        <SortableGridViewColumn
          Header="Name"
          SortProperty="ProductName"
          DisplayMemberBinding="{Binding ProductName}"/>
      </GridView>
    </SortableListView.View>
  </SortableListView>

当窗口显示时,我初始化并填充ObservableCollection<Item> Items

现在我想将一个(并且只有一个(特殊项目添加到列表顶部,并始终将其保留为第一个项目,无论排序顺序如何。

目前,我可以想到两种可能的方法来实现这一点:

  1. 为我的 ListView 创建一个非常特殊的数据模板,我可以在其中添加特殊项和主题 ListView 以相应地处理所有内容。
  2. 绑定到标头并处理 click 事件以在我的代码隐藏文件中执行排序,并在顶部插入特殊项。
选项

1 似乎工作量太大、太复杂,而选项 2 是我想避免的。

我缺少什么替代解决方案吗?如果没有,实现这一目标的最佳选择是什么,我应该如何处理主题选项?

如何将特殊项添加到列表视图并将其保留在顶部

我在这里猜测,但我假设您正在使用此控件?

http://thejoyofcode.com/Sortable_ListView_in_WPF.aspx

如果是这样,它使用 ICollectionView 来管理它的排序。ICollectionView非常灵活,允许对多个字段进行排序(你知道在SQL中:按Field1 ASC,Field2 DESC排序(。

我认为您要做的是在为用户选择的属性添加描述之前插入额外的排序描述。这样,它将首先按"标记"项目排序,然后按所选属性名称排序。

(代码改编自上述文章(

private void Sort(string sortBy, ListSortDirection direction)
{
    ICollectionView dataView = CollectionViewSource.GetDefaultView(this.ItemsSource);
    if (dataView != null)
    {
        dataView.SortDescriptions.Clear();
        dataView.SortDescriptions.Add(new SortDescription("IsAtTop", ListSortDirection.Ascending));
        SortDescription sd = new SortDescription(sortBy, direction);
        dataView.SortDescriptions.Add(sd);
        dataView.Refresh();
    }
}

因此,您只需要向名为"IsAtTop"的对象添加一个名为"IsAtTop"的bool属性。

希望这是你需要的。

在视图模型中,您可以保留一个单独的ObservableCollection<T>,该返回列表,并在顶部添加一个"特殊"项。如果挂钩原始ObservableCollection<T>CollectionChanged 事件,以便可以在集合上调用PropertyChanged通知,则可以实现所需的行为。