我正在创建一个应用程序,用于列出我拥有和想要的书籍..这个应用程序有一个Sqlite数据库。每本书都有一行,其中包含列ID,作者和标题。我的问题是,当我添加一本新书时,我想让这个用户选择输入一个新的作者姓名或者从选择器中获取一个。选择器ItemsSource来自作者列。我的问题是因为每个作者可以有一本以上的书,作者的名字在选择器中多次出现
<StackLayout Orientation="Horizontal">
<Entry x:Name="authorName" HorizontalOptions="FillAndExpand" Text="{Binding Author}"
Keyboard="Text"
StyleClass="entry"/>
<StackLayout>
<Button x:Name="PickAuthor" Text="..." WidthRequest="40"
Clicked="PickAuthor_Clicked"/>
</StackLayout>
<Picker x:Name="ExistingAuthors"
Title="Select Author"
IsVisible="False"
SelectedIndexChanged="ExistingAuthors_SelectedIndexChanged">
<Picker.ItemDisplayBinding>
<Binding Path="Author" />
</Picker.ItemDisplayBinding>
</Picker>
</StackLayout>
protected override async void OnAppearing()
{
await _connection.CreateTableAsync<WishList>();
var book = await _connection.Table<WishList>().ToListAsync();
_book = new ObservableCollection<WishList>(book);
base.OnAppearing();
}
private void PickAuthor_Clicked(object sender, EventArgs e)
{
ExistingAuthors.ItemsSource = _book.Distinct().ToList();
ExistingAuthors.Focus();
}
private void ExistingAuthors_SelectedIndexChanged(object sender, EventArgs e)
{
authorName.Text = ExistingAuthors.Items[ExistingAuthors.SelectedIndex];
}
我不希望选择器取代重复。
要从列表中删除重复项,您可以使用Linq。下面的方法按重复字段对集合进行分组,并选择第一个组。
private void PickAuthor_Clicked(object sender, EventArgs e)
{
ExistingAuthors.ItemsSource = _book.GroupBy(b => b.Author) // group by Author
.Select(g => g.First()) // select first group
.ToList();
ExistingAuthors.Focus();
}
这将返回您的实体类型的列表。
如果您只显示作者列表,请从Authors
中选择_book
,然后调用Distinct
删除重复的作者姓名。
private void PickAuthor_Clicked(object sender, EventArgs e)
{
ExistingAuthors.ItemsSource = _book.Select(x => x.Author.Trim()).Distinct().ToList();
ExistingAuthors.Focus();
}