Я пробовал все "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", через элементы кнопок в виде списка? Есть ли шанс на столь необходимую руку помощи? Спасибо!
@ Джейсон привет, извини, если я не понял. Я могу запустить обработчик событий как из изображения, так и из кнопки внутри элемента списка, просто привязка изображения передаст мне выбранный элемент и все его детали (var selectedItem = ((ListView) sender) .SelectedItem), но кнопка внутри элемента списка ничего мне не дает. Надеюсь, я понятнее. Кричи, если нет. Приветствую вас за поиск ...
CommandParameter = "{Привязка.}"
@Jason изменил "CommandParameter = " {Binding Source = {x: Reference buttonstack}, Path = BindingContext} "" на CommandParameter = "{Binding.}" ... кнопка сейчас даже не срабатывает.
Я заметил, что у вас есть BindingContext, назначенный только для этой кнопки, что не сработает с моим предложением. Вместо этого попробуйте использовать его только с обработчиком Clicked
@ Джейсон, красотка! Это сработало! Если бы был танцевальный смайлик Карлтона, вы бы его получили! Поскольку отправитель ListView ничего не доставил, я также изменил обработчик событий на: public async void OnClickViewImageCarousel (отправитель объекта, EventArgs e) {var selectedItem = ((Button) sender) .CommandParameter; var page = new PapillonRackItemViewPage (((RackProduct) selectedItem) .Id); ждать Navigation.PushModalAsync (страница); } И я вижу подробности в CommandParameter. Спасибо!!!





в вашем XAML
Clicked = "OnClickViewImageCarousel" CommandParameter = "{Binding .}"
затем в коде позади
protected void OnClickViewImageCarousel(object sender, EventArgs e)
{
var selectedItem = (RackProduct)((Button)sender).CommandParameter;
}
Проблема в том, что вы не можете запустить событие / команду для отдельных кнопок или вы не знаете, как получить доступ к контексту для элемента в обработчике?