我最近想在 ListView 中实现相同的外观。然而,就我而言,我需要对 ListView 中的项目进行滑动上下文操作。使用上述方法,列表中显示项目的高度与上下文操作菜单的高度之间存在大小差异。
我想出的解决方案是利用 ListView 中的分组,每个组包含一个项目,并添加一个自定义组标题视图,它只是一个具有所需间距高度的透明视图。这将确保上下文菜单大小等于项目的视图大小。
这是我用来创建和管理分组的一个简单类:
public class SingleItemGrouping<T>
{
private ObservableCollection<SingleItemGroup<int, T>> _groups { get; set; } = new ObservableCollection<SingleItemGroup<int, T>>();
public ObservableCollection<SingleItemGroup<int, T>> Groups { get { return _groups; } }
private SingleItemGrouping(ObservableCollection<T> collection = null)
{
if (collection != null)
{
foreach (var item in collection)
{
this.Add(item);
}
collection.CollectionChanged += Collection_CollectionChanged;
}
}
public static ObservableCollection<SingleItemGroup<int, T>> Create(ObservableCollection<T> collection)
{
SingleItemGrouping<T> ret = new SingleItemGrouping<T>(collection);
return ret.Groups;
}
private void Collection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
var collection = sender as ObservableCollection<T>;
if (e.OldItems != null)
{
foreach (var item in e.OldItems)
{
this.Remove((T)item);
}
}
if (e.NewItems != null)
{
foreach (var item in e.NewItems)
{
if (collection != null)
{
var index = collection.IndexOf((T)item);
if (index >= 0)
{
Insert(index, (T)item);
continue;
}
}
Add((T)item);
}
}
}
public void Insert(int index, T item)
{
int groupKey = item.GetHashCode();
_groups.Insert(index, new SingleItemGroup<int, T>(groupKey, item));
}
public void Add(T item)
{
int groupKey = item.GetHashCode();
_groups.Add(new SingleItemGroup<int, T>(groupKey, item));
}
public void Remove(T item)
{
int groupKey = item.GetHashCode();
var remove = _groups.FirstOrDefault(x => x.GroupKey == groupKey);
if (remove != null)
{
_groups.Remove(remove);
}
}
}
public class SingleItemGroup<K, TItem> : ObservableCollection<TItem>
{
public K GroupKey { get; private set; }
public TItem Item { get { return Items[0]; } }
public SingleItemGroup(K key, TItem item)
{
GroupKey = key;
Items.Add(item);
}
}
这是实现:
XAML:
<ListView x:Name="listView"
HasUnevenRows="true"
SeparatorVisibility="None"
IsGroupingEnabled="true">
<ListView.GroupHeaderTemplate >
<DataTemplate >
<ViewCell Height="20">
<Label />
</ViewCell>
</DataTemplate>
</ListView.GroupHeaderTemplate>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.ContextActions>
<MenuItem Clicked="DeleteRecipe" CommandParameter="{Binding .}" Text="Delete" IsDestructive="True" />
</ViewCell.ContextActions>
<!-- define viewcell contents here -->
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView.ItemTemplate>
.CS
listView.ItemsSource = SingleItemGrouping<MyViewModel>.Create(myObservableCollection);