【问题标题】:How to add a special item to a listview and keep it at the top?如何将特殊项目添加到列表视图并保持在顶部?
【发布时间】:2011-08-19 12:05:31
【问题描述】:

我有一个SortableListView,我通过绑定设置了 ItemsSource。类似于以下内容:

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

当窗口显示时,我初始化并填充ObservableCollection&lt;Item&gt; Items

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

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

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

选项 1 看起来工作量太大太复杂,而选项 2 是我想避免的。

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

【问题讨论】:

    标签: c# wpf xaml controls


    【解决方案1】:

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

    http://thejoyofcode.com/Sortable_ListView_in_WPF.aspx

    如果是这样,它使用 ICollectionView 来管理它的排序。 ICollectionView 非常灵活,允许对多个字段进行排序(您知道,就像在 SQL 中一样:SORT BY 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”的对象添加一个 bool 属性。

    希望这是你需要的......

    【讨论】:

    • 我当前的实现不使用 ICollectionView,但我可以对其进行修改。所以这是一个很好的基础。谢谢。
    【解决方案2】:

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

    【讨论】:

    • 如果他的 SortableListView 控件使用 IColllectionView 来管理项目,这将不起作用,因为您在屏幕上看到的列表实际上是数据源的副本,这意味着当用户单击更改排序时顺序,底层 ObservableCollection 的排序顺序保持不变。因此,即使您在绑定之前设法以正确的顺序获取它,ICollectionView 也会根据提供的排序描述对项目进行排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多