按钮命令不起作用,按钮位于集合视图内

Jho*_* JM 2 c# xamarin.forms

当我尝试通过单击按钮调用命令时遇到问题,这是我的代码,请帮助 Postscript,如果我将按钮从 collectionView 上移开,命令将起作用。该命令的名称是ButtonCommand,我想我需要更多参数,帮助。

主页.Xaml

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:d="http://xamarin.com/schemas/2014/forms/design"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         mc:Ignorable="d"
         x:Class="XamarinCollectionView.MainPage"
         xmlns:viewModels="clr-namespace:PruebaAppMap.ViewModels"
         xmlns:Models="clr-namespace:PruebaAppMap.Models"
         x:DataType="viewModels:MainPageViewModel"
         BackgroundColor="#2471A3">

<CollectionView  ItemsSource="{Binding Products}">
    <CollectionView.ItemTemplate>
        <DataTemplate x:DataType="Models:Product">
            <Frame
                Padding="5"
                CornerRadius="5"
                IsClippedToBounds="False">
                <Grid HeightRequest="100">
                    <Grid.ColumnDefinitions >
                        <ColumnDefinition Width=".3*"/>
                        <ColumnDefinition Width=".7*"/>
                        <ColumnDefinition Width=".4*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height=".5*"/>
                        <RowDefinition Height=".5*"/>
                        <RowDefinition Height=".7*"/>
                    </Grid.RowDefinitions>
                    <Label Grid.Column="1" FontAttributes="Bold" FontSize="Large" VerticalOptions="Center" Text="{Binding Name}"/>
                    <Label Grid.Column="1" Grid.Row="1"  FontSize="Medium" Text="{Binding Price,StringFormat='{0:C}'}"/>
                    <Button Grid.Column="3" Grid.RowSpan="2" Grid.Row="1" x:DataType="viewModels:MainPageViewModel"  Text="Click me!" CommandParameter="{Binding}" Command="{Binding ButtonCommand}"/>
                </Grid>

            </Frame>

        </DataTemplate>
    </CollectionView.ItemTemplate>

</CollectionView>
Run Code Online (Sandbox Code Playgroud)

视图模型--MainPageViewModel

namespace PruebaAppMap.ViewModels{

public class MainPageViewModel
{

    public ObservableCollection<Product> Products { get; set; }
    public ICommand ButtonCommand { get; set; }
    public MainPageViewModel() 
    {
        Products = new ObservableCollection<Product>
        {
            new Product
            {
                Name="Yogurt",
                Price=5.50m,
                Image="yogurt.png",
                hasOffer=false

            },              

        };
        ButtonCommand = new Command(async () => await buton());
    }
    public async Task buton()
    {
        await App.Current.MainPage.DisplayAlert("Button pressed", "button was pressed", "ok");
    }}
}
Run Code Online (Sandbox Code Playgroud)

Jac*_*Hua 5

正如 Jason 所说,BindingContextDataTemplate 内的按钮是 的一个实例ProductButtonCommand没有为产品定义。ButtonCommand 在您的 ViewModel 中,因此您需要引用ViewModel.ButtonCommand

首先,为您的 ContentPage 命名,如下所示MyPage

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"

             x:Name="MyPage"

             x:Class="App266.MainPage">
Run Code Online (Sandbox Code Playgroud)

在你的绑定中:

<Button Grid.Column="3" Grid.RowSpan="2" Grid.Row="1" Text="Click me!" Command="{Binding BindingContext.ButtonCommand, Source={x:Reference MyPage}}"/>
Run Code Online (Sandbox Code Playgroud)

顺便说一句,没有必要写x:DataType

请参阅:Xamarin 按钮命令(ListView.ItemTemplate 内部)未触发