Как обновить пользовательский интерфейс средства выбора в формах xamarin - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть 3 элемента управления выбора, и я пытаюсь привязать один список ко всем 3 элементам управления выбора.Если в первом элементе управления выбора выбран один параметр, то этот параметр не должен повторяться в остальных элементах управления выбора. Я не могу понять, как его реализовать.

Я пытался использовать Security_Question_1_SelectedIndexChanged () в MainPageФайл .cs, но пользовательский интерфейс не обновляется.

MainPage.xaml:

 <Label x:Name="Security_Questions" Margin="0,20,0,0" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" Text="Security Questions" FontSize="Micro" TextColor="MediumVioletRed"></Label>
 <Picker x:Name="Security_Question_1" ItemsSource="{Binding SecurityQuestions_List}"  Title="Select question one" Grid.Column="0" Grid.Row="1" Margin="-4,0,0,0" FontSize="Micro">                                                                      
 </Picker>                                
 <Entry x:Name="Security_Answer_1" Placeholder="Type answer" Grid.Column="1" Grid.Row="1" FontSize="Micro"/>
 <Picker x:Name="Security_Question_2" ItemsSource="{Binding SecurityQuestions_List}" Title="Select question two" Grid.Column="0" Grid.Row="2" Margin="-4,0,0,0" FontSize="Micro">                                    
 </Picker>
 <Entry  x:Name="Security_Answer_2" Placeholder="Type answer" Grid.Column="1" Grid.Row="2" FontSize="Micro"/>
 <Picker x:Name="Security_Question_3" ItemsSource="{Binding SecurityQuestions_List}" SelectedIndexChanged="Security_Question_3_SelectedIndexChanged" Title="Select question three" Grid.Column="0" Grid.Row="3" Margin="-4,0,0,0" FontSize="Micro">                                    

Файл MainPage.cs:

  public MainPage()
    {
        InitializeComponent();
        this.BindingContext = new RegistrationPageViewModel();
    }

  private void Security_Question_1_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            var t1 = ((Xamarin.Forms.Picker)sender).SelectedItem.ToString();
            if (t1 == "What is your first vehicle number?")
            {                    
                this.Security_Question_2.ItemsSource.Remove("What is your first vehicle number?");
                this.Security_Question_3.ItemsSource.Remove("What is your first vehicle number?");
            }
            else if (t1 == "What is your child's nick name?")
            {
                this.Security_Question_2.ItemsSource.Remove("What is your child's nick name?");
                this.Security_Question_3.ItemsSource.Remove("What is your first vehicle number?");
            }
            else
            {
                this.Security_Question_2.ItemsSource.Remove("What is your first school name?");
                this.Security_Question_3.ItemsSource.Remove("What is your first vehicle number?");
            }
        }
        catch (Exception)
        {

            throw;
        }
    }

RegistrationPageViewModel:

public RegistrationPageViewModel()
    {
        _department = new List<string>()

    {
        "What is your first vehicle number?",
        "What is your child's nick name?",
        "What is your first school name?"
    };
    }
    List<string> _department;

    public List<string> SecurityQuestions_List
    {
        get { return _department; }
        private set
        {
            _department = value;
            OnPropertyChanged();
        }
    }

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

«Я хочу, чтобы пользователь не выбирал повторяющиеся значения в каждом сборщике».

Вы можете сделать что-то со свойством SelectedItemProperty, вероятно, не лучший способ сделать это, но один.

Для каждого сборщика вы привязываете свойство SelectedItemProperty к свойству в ViewModel.Установка значения null в этом свойстве сделает работу, когда пользователь выберет значение, которое уже установлено в другом средстве выбора.Допустим, это с двумя сборщиками, вы можете легко адаптировать его для трех сборщиков.

 <Picker x:Name="Security_Question_1" .... SelectedItemProperty="SelectedItemPicker1">                                    
 </Picker>
 <Picker x:Name="Security_Question_2" .... SelectedItemProperty="SelectedItemPicker2"> 
</Picker>

ViewModel

 public string SelectedItemPicker1
            {
                get => _selectedItemPicker1;
                set
                {
                    if (_selectedItemPicker1== value) return;
                    if (value == _selectedItemPicker2)
                    {
                        _selectedItemPicker2 = null;
                        OnPropertyChanged("SelectedItemPicker2");
                    }
                    _selectedItemPicker1 = value;
                    OnPropertyChanged("SelectedItemPicker1");
                }
            }

            public string SelectedItemPicker2
            {
                get => _selectedItemPicker2;
                set
                {
                    if (_selectedItemPicker2 == value) return;
                    _selectedItemPicker2 = value == _selectedItemPicker1 ? null : value;
                    OnPropertyChanged("SelectedItemPicker2");
                }
            }

Я не поклонник такой логики в установщиках, но, как я сказал, должен быть лучший подход.

0 голосов
/ 26 декабря 2018

Вы можете использовать конвертер для 2 других записей в ItemSource при использовании привязки данных, передавая SelectedItem из записи в качестве параметра конвертера, и внутри конвертера вы можете удалить выбранный элемент, который вы передали в качестве параметра.

...