c# - 如何通过 Xamarin.Forms 中另一个选择器的选定项过滤选择器?
问题描述
我将数据存储在 Xamarin.Forms 应用程序的 SQLite 数据库中,如下所示:
- 一个
- 一个
- 一个
- 一个
- 乙
- 乙
- 乙
- C
等等等等
两列,一列作为不同的值列表,另一列作为“类别”。我有一个带有类别的选择器,我想做的就是选择一个类别,然后只在第二个选择器中显示该类别中的值。例如,在 Picker 1 中选择“B”将 Picker 2 的选项过滤为 5、6 和 7。我为 Picker 1 的 SelectedIndexChanged 设置了一个事件处理程序,但我只是不知道将什么设置为 Picker 2 的 ItemsSource SQLite 的。
编辑:找到解决方案,发布以供将来参考。此代码在 Picker 1 的已创建事件处理程序中运行。
private void Picker1_SelectedIndexChanged(object sender, EventArgs e)
{
using (SQLiteConnection conn = new SQLiteConnection(App.DatabaseLocation))
{
var assets = conn.Table<Values>();
Picker2.ItemsSource = conn.Query<Values>("select * from Values where Category = ?", Picker1.SelectedItem);
}
}
解决方案
我强烈建议您一次检索所有数据,而不是每次都选择 Picker1,再次查询数据库,然后再次填充 Picker2。这将在很大程度上取决于网络并影响交互性。
因此,我们可以根据我们的数据结构一次获得所需的数据。
我创建了一个简单的演示来模拟该功能,主要代码是:
班级ValueModel
public class ValueModel
{
public string ValueName { get; set; }
}
班级CategoryModel
public class CategoryModel
{
public string CategoryName { get; set; }
public ObservableCollection<ValueModel> values { get; set; }
public CategoryModel()
{
values = new ObservableCollection<ValueModel>();
}
}
班级CategoryViewModel
public class CategoryViewModel
{
public ObservableCollection<CategoryModel> Categories { get; set; }
public CategoryViewModel()
{
Categories = new ObservableCollection<CategoryModel>();
}
}
主页.xaml
<StackLayout>
<Picker Title="select category" x:Name="CategoryPicker" ItemsSource="{Binding Categories}" ItemDisplayBinding="{Binding CategoryName}" SelectedIndexChanged="DiameterPicker_SelectedIndexChanged"></Picker>
<Picker Title="select value" x:Name="ValuePicker" ItemDisplayBinding="{Binding ValueName}"></Picker>
</StackLayout>
MainPage.xaml.cs
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
var categories = new ObservableCollection<CategoryModel>() {
new CategoryModel{CategoryName="A",values= {new ValueModel{ ValueName="1" }, new ValueModel { ValueName = "2" }, new ValueModel { ValueName = "3" } ,new ValueModel{ ValueName="4"}} },
new CategoryModel{CategoryName="B",values= {new ValueModel{ ValueName="5" }, new ValueModel { ValueName = "6" }, new ValueModel { ValueName = "7" } } }
};
CategoryViewModel categoryViewModel = new CategoryViewModel();
categoryViewModel.Categories = categories;
BindingContext = categoryViewModel;
}
private void DiameterPicker_SelectedIndexChanged(object sender, EventArgs e)
{
CategoryViewModel viewModel = BindingContext as CategoryViewModel;
ValuePicker.ItemsSource = viewModel.Categories[((Picker)sender).SelectedIndex].values;
}
}
结果是:
推荐阅读
- java - 如何收集列表的多个元素
- javascript - 来自数据uri的交互式svg在反应
- angular - 无法从 Angular HTTP 拦截器获取请求标头值
- c# - 返回作为从树的根到一般树中的叶子的最长路径的一部分的项目列表
- python - 为什么 tflite 模型的准确性与 keras 模型如此不同?
- c++ - 函数参数和函数体的本地可见 typedef
- reactjs - 如何使用 AG 网格在反应中显示用户数组的数据
- python - 当 x 在 python 中介于 1 和 100 之间时,绘制 y=logx
- html - 在 Bootstrap 中设置位置而不影响响应能力
- cuda - 如何使用共享内存和全局内存,是否可以使用共享作为计算的中间阶段