一个TableView菜单
除了显示数据或用作表单或设置对话框外,TableView也可以是菜单。 功能上,菜单是按钮的集合,虽然它们可能看起来不像传统的按钮。 每个菜单项都是一个触发程序操作的命令。
这就是TextCell和ImageCell具有Command和CommandParameter属性的原因。 这些单元格可以触发ViewModel中定义的命令,或者只是ICommand类型的其他属性。
MenuCommands程序中的XAML文件将四个TextCell元素的Command属性与名为MoveCommand的属性绑定,并传递给名为“left”,“up”,“right”和“down”的MoveCommand参数:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MenuCommands.MenuCommandsPage"
x:Name="page">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness"
iOS="0, 20, 0, 0" />
</ContentPage.Padding>
<StackLayout>
<TableView Intent="Menu"
VerticalOptions="Fill"
BindingContext="{x:Reference page}">
<TableRoot>
<TableSection Title="Move the Box">
<TextCell Text="Left"
Command="{Binding MoveCommand}"
CommandParameter="left" />
<TextCell Text="Up"
Command="{Binding MoveCommand}"
CommandParameter="up" />
<TextCell Text="Right"
Command="{Binding MoveCommand}"
CommandParameter="right" />
<TextCell Text="Down"
Command="{Binding MoveCommand}"
CommandParameter="down" />
</TableSection>
</TableRoot>
</TableView>
<AbsoluteLayout BackgroundColor="Maroon"
VerticalOptions="FillAndExpand">
<BoxView x:Name="boxView"
Color="Blue"
AbsoluteLayout.LayoutFlags="All"
AbsoluteLayout.LayoutBounds="0.5, 0.5, 0.2, 0.2" />
</AbsoluteLayout>
</StackLayout>
</ContentPage>
但MoveCommand属性在哪里? 如果查看TableView的BindingContext,您将看到它引用了XAML文件的根元素,这意味着可能会在代码隐藏文件中找到MoveCommand属性作为属性。
它是:
public partial class MenuCommandsPage : ContentPage
{
int xOffset = 0; // ranges from -2 to 2
int yOffset = 0; // ranges from -2 to 2
public MenuCommandsPage()
{
// Initialize ICommand property before parsing XAML.
MoveCommand = new Command<string>(ExecuteMove, CanExecuteMove);
InitializeComponent();
}
public ICommand MoveCommand { private set; get; }
void ExecuteMove(string direction)
{
switch (direction)
{
case "left": xOffset--; break;
case "right": xOffset++; break;
case "up": yOffset--; break;
case "down": yOffset++; break;
}
((Command)MoveCommand).ChangeCanExecute();
AbsoluteLayout.SetLayoutBounds(boxView,
new Rectangle((xOffset + 2) / 4.0,
(yOffset + 2) / 4.0, 0.2, 0.2));
}
bool CanExecuteMove(string direction)
{
switch (direction)
{
case "left": return xOffset > -2;
case "right": return xOffset < 2;
case "up": return yOffset > -2;
case "down": return yOffset < 2;
}
return false;
}
}
Execute方法操纵XAML文件中BoxView的布局边界,使其在AbsoluteLayout周围移动。 如果已将BoxView移动到其中一个边缘,则CanExecute方法将禁用操作。
仅在iOS上,禁用的TextCell实际上显示为典型的灰色,但在iOS和Android平台上,如果CanExecute方法返回false,则TextCell不再起作用:
您还可以使用TableView作为页面导航菜单或使用主/详细页面,对于这些特定的应用程序,您可能想知道ListView或TableView是否适合作业。 一般来说,如果你有一个项目集合应该以相同的方式显示,那么它就是ListView,或者TableView用于可能需要个别关注的较少项目。
可以肯定的是,你肯定会在前面的章节中看到更多的例子。