Привязка кнопки внутри элемента ListView (Xamarin)

Я пробовал все "Qs, которые могут иметь ваш ответ" 3 дня спустя, все еще без радости.

У меня есть страница XAML, которая содержит ListView продуктов и их подробностей, используя привязку к модели под названием RackProducts, как вы можете видеть:

<?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 = "PapillonWine.PapillonRackCatalogPage" 
             xmlns:local = "clr-namespace:PapillonWine;assembly=PapillonWine" 
             xmlns:artina = "clr-namespace:UXDivers.Artina.Shared;assembly=UXDivers.Artina.Shared"
             xmlns:customContentView = "clr-namespace:PapillonWine.NavBars"
             Title = "{ artina:Translate PageTitleProductsCatalog }"
             BackgroundColor = "{ DynamicResource MainWrapperBackgroundColor }"
             x:Name = "CatalogItemPage">

    <ContentPage.Content>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height = "70" />
                <RowDefinition Height = "Auto" />
            </Grid.RowDefinitions>

            <customContentView:CustomNavigationBar Grid.Row = "0" x:Name = "NavigationBarView" BackgroundColor = "Transparent"/>

            <ListView
            x:Name = "PapillonRackItems"    
            Grid.Row = "1" 
            ItemsSource = "{ Binding RackProducts }"
            HasUnevenRows = "True"
            ItemSelected = "OnItemSelected">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <local:PapillonCatalogItemTemplate />
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Grid>
    </ContentPage.Content>
</ContentPage>

Каждый продукт отображается с помощью шаблона PapillonCatalogItemTemplate, который содержит четыре кнопки (для просмотра карусели изображений продуктов, для добавления в корзину, для просмотра размеров и, наконец, для публикации продукта). Этот шаблон PapillonCatalogItemTemplate выглядит следующим образом:

<?xml version = "1.0" encoding = "utf-8"?>
<ContentView xmlns = "http://xamarin.com/schemas/2014/forms" 
             xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class = "PapillonWine.PapillonCatalogItemTemplate" 
             xmlns:local = "clr-namespace:PapillonWine;assembly=PapillonWine" 
             xmlns:artina = "clr-namespace:UXDivers.Artina.Shared;assembly=UXDivers.Artina.Shared"
             xmlns:customContentView = "clr-namespace:PapillonWine.NavBars"
             xmlns:ffimageloading = "clr-namespace:FFImageLoading.Forms;assembly=FFImageLoading.Forms" 
             xmlns:fftransformations = "clr-namespace:FFImageLoading.Transformations;assembly=FFImageLoading.Transformations"
             Padding = "10" BackgroundColor = "{ DynamicResource MainWrapperBackgroundColor }" 
             x:Name = "CatalogItemTemplate">

    <!-- FAVORITE ICON -->


    <Grid>
        <!-- COLUMN DEFS -->
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width = "*" />
        </Grid.ColumnDefinitions>
        <!-- ROW DEFS -->
        <Grid.RowDefinitions>
            <RowDefinition Height = "0.45*" />
            <RowDefinition><RowDefinition.Height><OnIdiom x:TypeArguments = "GridLength" Phone = "200" Tablet = "400" /></RowDefinition.Height></RowDefinition>
        </Grid.RowDefinitions>

      <StackLayout Grid.Column = "0" Grid.Row = "0" Spacing = "5" HorizontalOptions = "FillAndExpand" WidthRequest = "1000" >

      <!-- PRODUCT NAME -->
        <Label Text = "{ Binding Name }" />                            

       <!-- DESCRIPTION -->
         <Label Text = "{Binding Description}" />


        <!-- BUTTONS -->
      <StackLayout x:Name = "buttonstack" Orientation = "Horizontal" >

          <!-- SHOW IMAGES -->
          <artina:Button
            x:Name = "ImageCarousel"
            Text = "{ x:Static local:FontAwesomeWeb511Font.CameraRetro }"
            Style = "{StaticResource FontIcon}"
            BindingContext = "{Binding Source = {x:Reference CatalogItemTemplate}, Path=BindingContext}" 
            Command = "{Binding OnClickViewImageCarousel}" 
            CommandParameter = "{Binding Source = {x:Reference buttonstack}, Path=BindingContext}" >

          <!-- SHOW CART -->
          <artina:Button
            Text = "{ x:Static local:FontAwesomeWeb511Font.cartplus }"
            Style = "{StaticResource FontIcon}"
            Clicked = "OnBuyItemSelected">
          </artina:Button>

          <!-- SHOW DIMENSIONS -->
          <artina:Button
            Text = "{ x:Static local:FontAwesomeWeb511Font.RulerCombined }"
            Style = "{StaticResource FontIcon}"
            Clicked = "OnDimensionsSelected" >

          <!-- SHOW IMAGES -->
          <artina:Button
            Text = "{ x:Static local:FontAwesomeFont.Share }"
            Style = "{StaticResource FontIcon}"
            Clicked = "OnShareSelected" >

        </StackLayout>                
        </StackLayout>     

                    <ffimageloading:CachedImage
                        Grid.Column = "0" Grid.Row = "1"
                        Source = "{ Binding Image }" />       
        </Grid>
</ContentView>

Если я щелкну изображение ffloading внизу элемента шаблона, срабатывает кнопка OnItemSelected, и я получаю красивую новую страницу просмотра с изображением продукта, который я выбрал, и всеми деталями его элемента ... хулиган! Код, который он запускает, выглядит следующим образом:

public async void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
        {
            var selectedItem = ((ListView)sender).SelectedItem;

            var page = new PapillonRackItemViewPage(((RackProduct)selectedItem).Id);

            await Navigation.PushModalAsync(page);
        }

Однако ... если я попытаюсь активировать одну из кнопок в шаблоне элемента (например, ту, которая находится непосредственно под "ПОКАЗАТЬ ИЗОБРАЖЕНИЯ", ничего не произойдет. Я оставил аргументы Commmand, CommandParameter и Binding в этой первой кнопке, но я не уверен, что они верны. Я пробовал маршрут ICommand, маршрут TapGestureRecognizer и пробовал большинство похожих сообщений, и мне действительно нужна помощь по этому вопросу. Как передать тот же контекст привязки, что и в ListView и его привязке "RackProducts", через элементы кнопок в виде списка? Есть ли шанс на столь необходимую руку помощи? Спасибо!

Проблема в том, что вы не можете запустить событие / команду для отдельных кнопок или вы не знаете, как получить доступ к контексту для элемента в обработчике?

Jason 22.10.2018 00:05

@ Джейсон привет, извини, если я не понял. Я могу запустить обработчик событий как из изображения, так и из кнопки внутри элемента списка, просто привязка изображения передаст мне выбранный элемент и все его детали (var selectedItem = ((ListView) sender) .SelectedItem), но кнопка внутри элемента списка ничего мне не дает. Надеюсь, я понятнее. Кричи, если нет. Приветствую вас за поиск ...

Mark 22.10.2018 00:20

CommandParameter = "{Привязка.}"

Jason 22.10.2018 00:24

@Jason изменил "CommandParameter = " {Binding Source = {x: Reference buttonstack}, Path = BindingContext} "" на CommandParameter = "{Binding.}" ... кнопка сейчас даже не срабатывает.

Mark 22.10.2018 00:43

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

Jason 22.10.2018 00:48

@ Джейсон, красотка! Это сработало! Если бы был танцевальный смайлик Карлтона, вы бы его получили! Поскольку отправитель ListView ничего не доставил, я также изменил обработчик событий на: public async void OnClickViewImageCarousel (отправитель объекта, EventArgs e) {var selectedItem = ((Button) sender) .CommandParameter; var page = new PapillonRackItemViewPage (((RackProduct) selectedItem) .Id); ждать Navigation.PushModalAsync (страница); } И я вижу подробности в CommandParameter. Спасибо!!!

Mark 22.10.2018 01:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
3 549
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

в вашем XAML

Clicked = "OnClickViewImageCarousel" CommandParameter = "{Binding .}"

затем в коде позади

protected void OnClickViewImageCarousel(object sender, EventArgs e) 
{
  var selectedItem = (RackProduct)((Button)sender).CommandParameter; 
}

Другие вопросы по теме