[英]How to add a special item to a listview and keep it at the top?
我有一个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似乎太多而且太复杂的工作和选项2是我想要避免的。
我有什么替代解决方案吗? 如果没有,那么实现这一目标的最佳选择是什么,我该如何处理主题选项?
我在这里猜测,但我假设你正在使用这个控件?:
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属性。
希望这是你需要的......
在视图模型中,您可以保留一个单独的ObservableCollection<T>
,它返回列表,顶部添加一个“特殊”项。 如果挂钩原始ObservableCollection<T>
的CollectionChanged
事件,以便可以在集合上调用PropertyChanged
通知,则可以实现所需的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.