如何在后台代码中访问CommandParameter?

时间:2019-01-11 21:46:38

标签: c# xaml xamarin xamarin.forms

我正在使用ListView来显示我从API获得的“任务”标题。单击作业后,我要转到该作业的详细信息页面。在这里,我想显示所选作业的描述和ID。我几乎都知道了这一切,但是我被困住了。

我的XAML页面如下:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="App.Views.AssignmentListPage"
         Title="Opdrachten">
<ListView x:Name="AssignmentsListView" Margin="20">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout Padding="20,0,0,0" HorizontalOptions="StartAndExpand" Orientation="Horizontal">
                    <Label Text="{Binding Title}" VerticalTextAlignment="Center">
                        <Label.GestureRecognizers>
                            <TapGestureRecognizer Tapped="OnLabelClicked" CommandParameter="{Binding .}"/>
                        </Label.GestureRecognizers>
                    </Label>
                    <!--<Label Text="{Binding Title}" VerticalTextAlignment="Center">
                        <Label.GestureRecognizers>
                            <TapGestureRecognizer Command="viewDetails" CommandParameter="{Binding .}"/>
                        </Label.GestureRecognizers>
                    </Label>-->
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

我的后台代码如下:“

public partial class AssignmentListPage : ContentPage
{
    public AssignmentListPage ()
    {
        InitializeComponent ();
    }

    protected override async void OnAppearing()
    {
        base.OnAppearing();

        AssignmentsListView.ItemsSource = await App.AssignmentManager.GetAssignmentsAsync();

    }

    async void OnLabelClicked(object s, EventArgs e)
    {

        var a = e.ToString();

        var assignment = new Assignment
        {
            Id = "1234",
            Title = "Cross-Platform Application",
            Description = "What a beautiful description"
        };

        var assignmentDetailsPage = new AssignmentDetailsPage
        {
            BindingContext = assignment
        };

        await Navigation.PushAsync(assignmentDetailsPage);
    }


}

如您所见,我已经在OnLabelClicked函数中硬编码了id,标题和描述。我想使用e.Parameter来获取这些数据,但这不是我可以选择的东西。我只能从ToStringEqualsgetType中进行选择。但是,当我运行该应用程序并检查e时,它确实包含“ Parameter”。见图片。

enter image description here

我尝试在XAML文件中使用Command代替Tapped,但是没有成功。我不知道该怎么做。

对于这一切我都是陌生的,而且我整天都在解决这个问题。我有一点隧道视野。我希望你们能为我指明正确的方向。

2 个答案:

答案 0 :(得分:2)

ListView具有内置的ItemTappedItemSelected事件,可以满足您的需求

<ListView x:Name="AssignmentsListView" Margin="20" ItemSelected="OnItemSelect">

public void OnItemSelect(sender s, SelectedItemChangedEventArgs a) 
{
   // a.SelectedItem will be the selected Item, you need to cast it
   var item = (MyClass)a.SelectedItem;

   ...
}

答案 1 :(得分:0)

您正在混合两种不希望混合使用的不同用户交互模式。您可以采用@Jason建议的路线并使用事件模式,该模式等同于许多UI框架(包括WinForms)中使用的事件驱动范例。基于XAML的框架(WPF,Xamarin等)也完全支持它,但是也值得理解命令模式。

command pattern是为更具声明性的使用模型而构建的,并且是应用程序开发MVVM model的一部分。这个想法是,您可以使用数据绑定在前端视图和支持它们的对象(在这种情况下称为视图模型)之间创建松散的连接。

在事件模式中,您将连接通过.NET委托调用的事件处理程序,命令是从ICommand派生的类,并且使用这些类型的对象来执行所需的逻辑以及执行指示状态(是否可以在当前时间调用该命令)之类的东西。

在这种情况下,您需要将ICommand对象(通常是视图模型的可绑定属性)绑定到Command的{​​{1}}属性和想要的值传递到TapGestureRecognizer属性。调用后,CommandParameter将被传递到CommandParameter对象的Execute方法。

有关更完整的代码示例,请参阅链接的文章(特别是有关Xamarin中的命令的文章)。

但是,如果需要,您确实可以返回到基于事件的可靠尝试模型。两者各有利弊。