Как заполнить сборщик на основе выбора в другом сборщике? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть приложение Xamarin.Forms, и оно использует FreshMvvm. У меня есть два средства выбора для выбора стран и штатов / провинций. Выбор стран изначально заполняется, но список штатов / провинций должен заполняться на лету в зависимости от выбранной страны. Я не могу найти, как это можно сделать с помощью команды, а не обработки событий кода. Вот мои элементы управления в 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 ?

1 Ответ

1 голос
/ 17 апреля 2020

используя 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 вручную. Это не изменит оставшуюся часть кода.

Надеюсь, это поможет .-

...