如何在xamarin中发送点击事件中的参数



我对Xamarin很陌生。我想发送我的绑定id作为按钮的点击事件的参数。

这是我的按钮:

<Button
Text="{Binding Name}"
Grid.Column="0"
HorizontalOptions="Center"
VerticalOptions="Center"
TextColor="Black"
BackgroundColor="#EEF2FF"
Command="{Binding Handle_AddProduct}"
CommandParameter="{Binding id}"
/>

所以我想用addProducts发送一个{Binding-id}作为参数。

这里id我的控制器:

public ObservableCollection<Product> AllProducts { get => GetProduct(); }
private ObservableCollection<Product> GetProduct()
{
return new ObservableCollection<Product>
{
new Product { id=1, Type = "Drink", Name = "Cola", Stock = 123 },
};
}
private ObservableCollection<addedProduct> _addedProduct;
public ObservableCollection<addedProduct> addedProducts
{
get
{
return _addedProduct ?? (_addedProduct = new ObservableCollection<addedProduct>());
}
}
protected void Handle_AddProduct(addedProduct newproduct)
{
foreach (var product in AllProducts)
{
if (newproduct.id == product.id)
{
addedProducts.Add(newproduct);
}
}
}
public ICommand addProducts { private set; get; }
public class Product
{
public int id { get; set; }
public string Type { get; set; }
public string Name { get; set; }
public int Stock { get; set; }
}
public class addedProduct
{
public int id { get; set; }
public string Type { get; set; }
public string Name { get; set; }
public int Stock { get; set; }
}

通常,我想做的是,当单击按钮时,对象(作为参数给定(应该添加到我的addedProduct列表中,稍后我可以在另一个视图中显示它。例如,其中一个按钮是Cola,所以当它被点击时,我会发送id作为参数,它会搜索产品列表,如果它在该列表中找到Cola,我会将其发送到addedProduct列表。

我希望我是清白的。谢谢你的帮助。

尝试使用Command而不是按钮Clicked事件。如果使用Command,则可以通过CommandParameter属性添加自定义参数。

查看此处的命令文档:https://learn.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/data-binding/commanding#using-命令参数

结果可能是这样的:

<Button
Text="{Binding Name}"
Grid.Column="0"
HorizontalOptions="Center"
VerticalOptions="Center"
TextColor="Black"
BackgroundColor="#EEF2FF"
Command="{Binding AddProductCommand}"
CommandParameter="{Binding .}"
/>
public class MyViewModel{
public ObservableCollection<Product> AllProducts { get; } = new ObservableCollection<Product>();
public ObservableCollection<Product> AddedProducts { get; } = new ObservableCollection<Product>();
public ICommand AddProductCommand { get; }
public MyViewModel(){
AddProductCommand = new Command<Product>(AddProduct);
AllProducts.Add(new Product { id = 1, Type = "Drink", Name = "Cola", Stock = 123 });
}
private void AddProduct(Product newProduct)
{
AddedProducts.Add(newProduct);
}
}

您的Button是否在列表视图的DataTemplate中?

如果是,那么您必须更改您的命令如下:

<Button  Text="add"  Grid.Column="0"
HorizontalOptions="Center"
VerticalOptions="Center"
TextColor="Black"
BackgroundColor="#EEF2FF"
Command="{Binding Path=BindingContext.AddProductCommand, Source={x:Reference lstView}}"  
CommandParameter="{Binding .}"

注意:lstView是您外部视图的x:Name="lstView"(例如ListView(。

您可以参考以下代码:

<ContentPage.BindingContext>
<sendparmdemo:MyViewModel></sendparmdemo:MyViewModel>
</ContentPage.BindingContext>
<ListView  x:Name="lstView" RowHeight="60" Grid.Row="1"  ItemsSource="{ Binding AllProducts}" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid ColumnSpacing="3" HorizontalOptions="FillAndExpand">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<BoxView Grid.RowSpan="1" BackgroundColor="#EEF2FF"/>
<BoxView Grid.Column="1" Grid.RowSpan="1" BackgroundColor="#EEF2FF"/>
<BoxView Grid.Column="2" Grid.RowSpan="1" BackgroundColor="#EEF2FF"/>
<Button  Text="add"  Grid.Column="0"
HorizontalOptions="Center"
VerticalOptions="Center"
TextColor="Black"
BackgroundColor="#EEF2FF"
Command="{Binding Path=BindingContext.AddProductCommand, Source={x:Reference lstView}}"  
CommandParameter="{Binding .}"
/>
<Label Text="{Binding Type}" HorizontalOptions="Fill" Grid.Column="1" HorizontalTextAlignment="Left" VerticalTextAlignment="Center"/>
<Label Text="{Binding Name}" HorizontalOptions="Fill" Grid.Column="2" HorizontalTextAlignment="Left" VerticalTextAlignment="Center"/>
<Label Text="{Binding Stock}" HorizontalOptions="Fill" Grid.Column="3" HorizontalTextAlignment="Left" VerticalTextAlignment="Center"/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

MyViewModel.cs

public class MyViewModel
{
public ObservableCollection<Product> AllProducts { get; set; } = new ObservableCollection<Product>();
public ObservableCollection<Product> AddedProducts { get; } = new ObservableCollection<Product>();
public ICommand AddProductCommand { get; }
private ObservableCollection<Product> GetProduct()
{
return new ObservableCollection<Product>
{
new Product { id=1, Type = "Drink", Name = "Cola", Stock = 123 },
new Product { id=2, Type = "Drink", Name = "Water", Stock = 123 },
new Product { id=3, Type = "Drink", Name = "Soda", Stock = 123 }
};
}
public void AddProduct(Object newProduct)
{
Product product = newProduct as Product;
System.Diagnostics.Debug.WriteLine("----> add product  id = " + product.id+ "<---->  Name = " + product.Name);
AddedProducts.Add(product);
}
public MyViewModel() {
AddProductCommand = new Command(AddProduct);
AllProducts = GetProduct();
}
}

注:

1.我使用了Listview来模拟您的功能,您可以将其更改为您的视图。

2.由于您有一个Label来显示Name属性,我将按钮的文本更改为Add,这使功能更加清晰。

最新更新