首页 > 解决方案 > 如何通过 Xamarin.Forms 中另一个选择器的选定项过滤选择器?

问题描述

我将数据存储在 Xamarin.Forms 应用程序的 SQLite 数据库中,如下所示:

  1. 一个
  2. 一个
  3. 一个
  4. 一个
  5. 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);
            }

        }

标签: c#sqlitexamlxamarin.forms

解决方案


我强烈建议您一次检索所有数据,而不是每次都选择 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;
    }
}

结果是:

在此处输入图像描述


推荐阅读