通过实施选择,滑动删除和拉式刷新,将交互功能添加到您的ListView。
让我们知道你对此的感受
ListView支持通过以下方式与其呈现的数据进行交互:
ListView
一次支持选择一个项目。默认情况下选择为开启。当用户点击一个项目时,会触发两个事件:ItemTapped
和ItemSelected
。请注意,点击相同的项目两次将不会触发多个ItemSelected
事件,但会触发多个ItemTapped
事件。还要注意,ItemSelected
如果取消选择项目,将被调用。
请注意,ItemSelected
当项目被取消选择并被选中时,它们被称为两者。这意味着您需要SelectedItem
在ItemSelected
事件处理程序中检查null ,然后才能使用它:
void OnSelection (object sender, SelectedItemChangedEventArgs e)
{
if (e.SelectedItem == null) {
return; //ItemSelected is called on deselection, which results in SelectedItem being set to null
}
DisplayAlert ("Item Selected", e.SelectedItem.ToString (), "Ok");
//((ListView)sender).SelectedItem = null; //uncomment line if you want to disable the visual selection state.
}
如果要禁用选择,请处理ItemSelected
事件并将SelectedItem
属性设置为null:
SelectionDemoList.ItemSelected += (sender, e) => {
((ListView)sender).SelectedItem = null;
};
启用选择:
请注意,在Windows Phone上,某些单元格,包括SwitchCell
不更新其视觉状态以响应选择。
通常,用户将希望对某个项目采取行动ListView
。例如,考虑邮件应用程序中的电子邮件列表。在iOS上,您可以滑动以删除邮件,在Windows Phone上,可以长按消息,然后将其删除:
上下文动作可以在C#和XAML中实现。下面你会找到两个具体的指南,但是首先让我们来看看这两个的一些关键的实现细节。
上下文操作使用MenuItem
s 创建。MenuItems的点击事件由MenuItem本身引发,而不是ListView。这不同于为单元格处理tap事件,其中ListView引发事件而不是单元格。因为ListView正在提升事件,它的事件处理程序将被给予关键信息,例如选择或点击哪个项目。
默认情况下,MenuItem无法知道它属于哪个单元格。CommandParameter
可MenuItem
用于存储对象,例如MenuItem的ViewCell后面的对象。CommandParameter
可以在XAML和C#中设置。
可以Cell
通过创建MenuItem
s并将其添加到ContextActions
单元的集合中,在任何子类中实现上下文操作(只要它不被用作组头)。您可以为上下文操作配置以下属性:
可以将多个上下文操作添加到单元格中,但只能IsDestructive
设置一个true
。以下代码演示了如何将上下文操作添加到ViewCell
:
var moreAction = new MenuItem { Text = "More" };
moreAction.SetBinding (MenuItem.CommandParameterProperty, new Binding ("."));
moreAction.Clicked += async (sender, e) => {
var mi = ((MenuItem)sender);
Debug.WriteLine("More Context Action clicked: " + mi.CommandParameter);
};
var deleteAction = new MenuItem { Text = "Delete", IsDestructive = true }; // red background
deleteAction.SetBinding (MenuItem.CommandParameterProperty, new Binding ("."));
deleteAction.Clicked += async (sender, e) => {
var mi = ((MenuItem)sender);
Debug.WriteLine("Delete Context Action clicked: " + mi.CommandParameter);
};
// add to the ViewCell's ContextActions property
ContextActions.Add (moreAction);
ContextActions.Add (deleteAction);
MenuItem
也可以声明地在XAML集合中创建。下面的XAML演示了实现了两个上下文操作的自定义单元格:
<ListView x:Name="ContextDemoList">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.ContextActions>
<MenuItem Clicked="OnMore" CommandParameter="{Binding .}"
Text="More" />
<MenuItem Clicked="OnDelete" CommandParameter="{Binding .}"
Text="Delete" IsDestructive="True" />
</ViewCell.ContextActions>
<StackLayout Padding="15,0">
<Label Text="{Binding title}" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
在代码隐藏文件中,确保实现Clicked
方法:
public void OnMore (object sender, EventArgs e) {
var mi = ((MenuItem)sender);
DisplayAlert("More Context Action", mi.CommandParameter + " more context action", "OK");
}
public void OnDelete (object sender, EventArgs e) {
var mi = ((MenuItem)sender);
DisplayAlert("Delete Context Action", mi.CommandParameter + " delete context action", "OK");
}
用户已经预期下拉列表的数据将刷新该列表。ListView
支持这个开箱即用的。要启用拉到刷新功能,设置IsPullToRefreshEnabled
为true:
listView.IsPullToRefreshEnabled = true;
用户拉动时拉动刷新:
当用户释放拉时,拉到刷新。这是用户在更新列表时看到的内容:
请注意,从Xamarin.Forms 1.4.3起,Windows Phone 8.1不支持拉式刷新。在Windows Phone 8上,拉入刷新不是本机平台的功能,所以Xamarin.Forms提供了拉入刷新的实现。最后,请注意,如果列表中的所有元素都可以适合屏幕(换句话说,如果不需要垂直滚动),则拉拔更新将无法在Windows Phone上运行。
ListView公开了一些允许您回应到刷新事件的事件。
RefreshCommand
将被调用和Refreshing
称为事件。IsRefreshing
将被设置为true
。EndRefresh
或设置IsRefreshing
来false
告诉你做的列表视图。 该CanExecute
属性受到尊重,这为您提供了一种方法来控制是否启用“拉到刷新”命令。