我试图弄清楚如何从 XAML 中的列表中获取索引。
语境
一个产品有多个包含规格细节的规格类别/组。
- Product & Ingrediënten是规格组。
- Land van afkomst : Nederland是规格细节
在 XAML 代码中,我使用的是嵌套列表。应用程序需要传递索引,以便用户可以正确删除和添加规范。
Binding Source="0" /> & CommandParameter="0" 处的索引需要传递而不是 "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 个方法:
private void ExecuteDeleteSpecificationEntryCommand(SpecificationDetailWithIndex specificationDetailWithIndex)
{
Product.Specifications[specificationDetailWithIndex.Index].SpecificationDetails.Remove(specificationDetailWithIndex.SpecificationDetailDbViewModel);
}