Как получить доступ к CommandParameter в коде позади? - PullRequest
0 голосов
/ 12 января 2019

Я использую ListView для отображения заголовков «назначений», которые я получаю от API. Как только я нажимаю на назначение, я хочу перейти на страницу сведений об этом назначении. Здесь я хочу показать описание и идентификатор выбранного назначения. Я почти все понял, но я застрял.

Моя страница 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. Я хочу использовать e.Parameter для получения этих данных, но это не то, что я могу выбрать. Я могу выбирать только из ToString, Equals, getType. Но когда я запускаю приложение и проверяю e, оно содержит «Параметр». Смотрите картинку.

enter image description here

Я пытался использовать Command вместо Tapped в файле XAML, но безуспешно. Я не мог узнать, как это сделать.

Я новичок во всем этом и целый день работаю над этим вопросом. Я получил немного туннельного зрения. Я надеюсь, что вы, ребята, можете указать мне правильное направление.

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вы смешиваете два разных шаблона взаимодействия с пользователем, которые не предназначены для смешивания. Вы можете пойти по пути, предложенному @Jason, и использовать шаблон событий, который будет эквивалентен управляемым событиями парадигмам, используемым во многих инфраструктурах пользовательского интерфейса, включая WinForms. Он также полностью поддерживается в основанных на XAML средах (WPF, Xamarin и т. Д.), Но также стоит понимать шаблон команд.

Шаблон команды предназначен для более декларативной модели использования и является частью модели MVVM разработки приложений. Идея состоит в том, чтобы использовать привязку данных для создания более слабых соединений между интерфейсными представлениями и объектами (в данном случае называемыми моделью представления), которые их поддерживают.

В то время как в шаблонах событий вы подключаете обработчики событий, которые вызываются через делегаты .NET, команды являются классами, производными от ICommand, и объекты этих типов используются как для выполнения желаемой логики, так и для выполнения таких вещей, как указать состояние (может ли команда быть вызвана в текущий момент или нет).

В этом случае вы бы связали объект ICommand (обычно это свойство привязки вашей модели представления) со свойством Command вашего TapGestureRecognizer и значением, которое вы хотите передать CommandParameter имущество. После вызова CommandParameter будет передано методу Execute объекта Command.

Для получения более полных примеров кода обратитесь к связанным статьям (в частности, первой, посвященной командованию в Xamarin).

Однако, если хотите, вы действительно можете вернуться к проверенной модели взаимодействия на основе событий. У каждого есть свои плюсы и минусы.

0 голосов
/ 12 января 2019

ListView имеет встроенные ItemTapped и ItemSelected события, которые будут делать то, что вы хотите

<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;

   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...