如何根据另一个选择器中的选择填充一个选择器?

How to populate a picker based on selection in another picker?

我有一个 Xamarin.Forms 应用程序,它使用 FreshMvvm。我有两个用于选择国家和 states/provinces 的选择器控件。最初会填充国家选择器,但 states/provinces 列表应根据所选国家即时填充。我找不到如何使用命令而不是代码隐藏事件处理来完成它。 这是我在 MyPage.xaml:

中的控件
            <Picker Title="Choose Country..."
            ItemsSource="{Binding Countries}"
            ItemDisplayBinding="{Binding Value}"
            SelectedItem="{Binding SelectedCountry}"
            Margin="0, 0, 0, 5" />

            <Picker Title="Choose State..."
            ItemsSource="{Binding States}"
            ItemDisplayBinding="{Binding Value}"
            SelectedItem="{Binding SelectedState}"
            Margin="0, 0, 0, 5" />

我应该在 MyPageModel.cs 中输入什么?

使用 Freshmvvm,您可以使用 WhenAny 方法并监听 SelectedCountry 属性 上的变化。发生这种情况时,您将使用 SelectedCountry 按国家/地区筛选州集合,并使用结果更新您的 States 集合。

应该是这样的:

[PropertyChanged.AddINotifyPropertyChangedInterface]
public class MyViewModel : FreshBasePageModel
{
    public ObservableCollection<Country> Countries { get; set; }

    public ObservableCollection<State> States { get; set; }

   // This would be the collection where you have all the States
    private List<State> _allStatesCollection = new List<State>();

    public Country SelectedCountry { get; set; }

    public MyViewModel()
    {
       // Listening for changes on the `SelectedCountry`
        this.WhenAny(OnCountryChanged, o => o.SelectedCountry);
    }

    //Method called when a new value is set in the `SelectedCountry` property
    private void OnCountryChanged(string property)
    {   
        //Filter the collection of states and set the results     
        var states = _allStatesCollection.Where(a => a.CountryCode == SelectedCountry.Code).ToList();        
        States = new ObservableCollection<State>(states);
    }
}

注意:以上代码要求您使用 Fody INotifyPropertyChanged Nuget 包。如果您不使用它,您可以安装它或手动实现您的属性 PropertyChanged。这不会更改其余代码。

希望对您有所帮助。-