Средство выбора не обновляется при изменении ItemsSource - PullRequest
0 голосов
/ 13 октября 2018

У меня есть Xamarin.Forms (3.2, последняя версия) Picker реализовано как

<Picker x:Name="ClassSelector"
            Title="Select Class"
            ItemsSource="{Binding Classrooms}"
            ItemDisplayBinding="{Binding ClassroomName}"
            SelectedItem="{Binding SelectedClassroom}">
</Picker>

BindingContext - это ViewModel:

public class ClassroomsViewModel : BaseViewModel
{
  public ObservableCollection<Classroom> Classrooms { get; set; }

  public ClassroomsViewModel()
  {
     Classrooms = new ObservableCollection<Classroom>(_ClassroomsRepository.GetAll());
  }
}

Теперь, когда я добавляюкласс в ViewModel, сборщик покорно добавляет элемент в свой список:

 Classrooms.Add(new Classroom() { ClassroomName = "test" });   // this works fine

Но если я изменю класс, Picker не обновит свой список элементов:

Classrooms[0].ClassroomName = "test";  // this doesn't have an effect,
                                       // although the value is set
                                       // in the ObservableCollection

Я также пытался явно позвонить:

    OnPropertyChanged();  // nothing
    OnPropertyChanged("Classrooms"); // nope

Если это важно, Classroom происходит от ObservableObject:

public class Classroom : ObservableObject
{
   private string classroomName;

   public string ClassroomName { get => classroomName; set => SetProperty(ref classroomName, value); }
}

Правка, в которой я поясняю, что не проблема замены коллекции:

Обратите внимание, что я не заменяю коллекцию Classrooms новой ObservableCollection- как это происходит в других сообщениях, которые могут показаться похожими на мою проблему.Я просто изменяю одного из членов коллекции.Когда эта коллекция привязана к другому элементу управления (например, ListView), она ведет себя точно так, как ожидается - обновления ListView отражают новый ClassroomName.

Может кто-нибудь указать мне, что я делаю неправильно?

1 Ответ

0 голосов
/ 14 октября 2018

Как правило, когда мы используем привязки, мы ожидаем, что цель (элемент выбора) будет синхронизироваться с источником привязки (в данном случае Classroom объект) - так что ваш код, по замыслу, правильный,

Однако после копания в Picker исходный код в github XF - похоже, что он отменяет подписку на изменения связывания / свойства после получения первого значения из Binding. Здесь вы можете увидеть явный вызов UnApply() к привязке, а затем к выражению привязки для отображаемого имени элемента выбора.

Вызов OnPropertyChanged("Classrooms"); на CustomerViewModel (не на Customer) должен работать технически.Или вы можете попытаться удалить измененный объект Customer из коллекции и повторно добавить его в тот же индекс, чтобы устранить эту проблему.Оба эти действия вызовут ResetItems() - который, в свою очередь, должен вызвать обновление для отображаемого имени элемента выбора .

...