如何将嵌套的 BindableLayout.ItemsSource 中的项目索引绑定到 CommandParameter - Xamarin [英] How to bind index of item in nested BindableLayout.ItemsSource to CommandParameter - Xamarin
问题描述
我想弄清楚如何从 XAML 中的列表中获取索引.
I'm trying to figure out how you can get the index from a list inside XAML.
背景
一个产品有多个规格类别/组,其中包含规格详细信息.
A product has multiple specification categories/groups which contain the specification details.
- 产品&Ingrediënten 是规范组.
- Land van afkomst:荷兰是规格详情
- Product & Ingrediënten are the specification groups.
- Land van afkomst : Nederland are the specs details
在 XAML 代码中,我使用了嵌套列表.应用程序需要传递索引,以便用户可以正确删除和添加规范.
In the XAML code, I'm using a nested list. The application needs to pass the Index so the users can delete and add specifications correctly.
绑定源=0"处的索引/>&命令参数=0"需要传递而不是0".
The index at Binding Source="0" /> & CommandParameter="0" needs to be passed instead of "0".
<StackLayout BindableLayout.ItemsSource="{Binding Product.Specifications}">
<BindableLayout.ItemTemplate>
<DataTemplate>
<StackLayout>
<Entry Text="{Binding Title, Mode=TwoWay}" />
<StackLayout BindableLayout.ItemsSource="{Binding SpecificationDetails}">
<BindableLayout.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=".44*" />
<ColumnDefinition Width=".44*" />
<ColumnDefinition Width=".12*" />
</Grid.ColumnDefinitions>
<Entry Grid.Row="0"
Grid.Column="0"
Text="{Binding Title}"
Style="{StaticResource spec-entry-style}" />
<Entry Grid.Row="0"
Grid.Column="1"
Text="{Binding Description}"
Style="{StaticResource spec-entry-style}" />
<!-- Delete specification detail -->
<Button Grid.Column="2"
Text="X"
Style="{StaticResource cancel-button-style}"
Command="{Binding Path=BindingContext.DeleteSpecificationEntryCommand, Source={x:Reference Page}}">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource SpecsConverter}">
<Binding Source="0" />
<Binding Path="." />
</MultiBinding>
</Button.CommandParameter>
</Button>
</Grid>
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
<!-- Add specification detail -->
<Button Text="Voeg specificatie toe"
Command="{Binding AddSpecicifationEntriesCommand}"
CommandParameter="0"
HorizontalOptions="Start" />
</StackLayout>
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
<!-- Add Specification group -->
<Button Text="Voeg nieuwe specificatie toe"
Command="{Binding AddNewSpecificationGroupCommand}" />
规格组模型:
public class SpecificationDbViewModel : INotifyPropertyChanged
{
private int _id;
private string _title;
private ObservableCollection<SpecificationDetailDbViewModel> _specificationDetails;
public int Id
{
get => _id;
set
{
_id = value;
RaisePropertyChanged(nameof(Id));
}
}
public string Title
{
get => _title;
set
{
_title = value;
RaisePropertyChanged(nameof(Title));
}
}
public ObservableCollection<SpecificationDetailDbViewModel> SpecificationDetails
{
get => _specificationDetails;
set
{
_specificationDetails = value;
RaisePropertyChanged(nameof(Title));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
规格详细型号:
public class SpecificationDetailDbViewModel : INotifyPropertyChanged
{
private int _id;
private string _title;
private string _description;
public int Id
{
get => _id;
set
{
_id = value;
RaisePropertyChanged(nameof(Id));
}
}
public string Title
{
get => _title;
set
{
_title = value;
RaisePropertyChanged(nameof(Title));
}
}
public string Description
{
get => _description;
set
{
_description = value;
RaisePropertyChanged(nameof(Description));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
我正在使用 MultiBinder 转换器将多个值传递给命令.删除规范的 ViewModel 中的 1 个方法:
I'm using a MultiBinder converter to pass multiple values to the command. 1 method inside the ViewModel that removes the specifications:
private void ExecuteDeleteSpecificationEntryCommand(SpecificationDetailWithIndex specificationDetailWithIndex)
{
Product.Specifications[specificationDetailWithIndex.Index].SpecificationDetails.Remove(specificationDetailWithIndex.SpecificationDetailDbViewModel);
}
推荐答案
- 不要打扰您的索引,只需将 THE 对象作为命令的参数发回即可.
Command="{...}" //same binding
CommandParameter="{Binding .}" //new line
- 并在您的 ViewModel 中使用正确的参数定义您的命令.
public ICommand<SpecificationDetailDbViewModel> DeleteSpecificationEntryCommand => new Command<SpecificationDetailDbViewModel>(ExecuteDeleteSpecificationEntryCommand);
private void ExecuteDeleteSpecificationDetailEntryCommand(SpecificationDetailDbViewModel item)
{
//remvoe item from collection
Product.Specifications?.Remove(item);
}
您还可以使用 组在列表视图中顺便说一句.
And you can also use groups in the list view btw.
这篇关于如何将嵌套的 BindableLayout.ItemsSource 中的项目索引绑定到 CommandParameter - Xamarin的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!