Я только что столкнулся с этой проблемой в проекте, над которым я работаю, и нахожусь в тупике. Как видно из рисунка ниже, при выборе элемента в диалоговом окне «Выбор» на iOS (эмулятор) выбранное значение переходит к последнему элементу в списке после подтверждения (независимо от того, выберу я из диалогового окна или использую кнопка Готово). На Android соответствующий диалог ведет себя правильно. Я использую Xamarin.Forms 4.5.0.356 и Xamarin.Essentials 1.5.1 для этого .
Минимальная копия ошибки
public class PickerItemModel
{
public string TestProp { get; set; }
public PickerItemModel(string t) => TestProp = t;
public override string ToString()
{
return TestProp;
}
}
public class MainViewModel : ComputedBindableBase
{
public List<PickerItemModel> PickerItemModels { get; set; } = new List<PickerItemModel> {
new PickerItemModel("Hello"),
new PickerItemModel("Stackoverflow")
};
public PickerItemModel SelectedModel { get; set; }
ComputedBindableBase реализовал событие INotifyPropertyChanged и автоматически вызывает его при изменении свойства.
<Picker Title="Test"
ItemsSource="{Binding PickerItemModels}"
SelectedItem="{Binding SelectedModel}" />
Теперь вопрос заключается в том, как исправить это поведение или как его можно обойти. Я готов использовать некоторые пользовательские пакеты для этого, но я не могу самостоятельно реализовать полный диалог, поскольку у меня есть некоторые ограничения в отношении проекта с точки зрения затраченного на него времени.
Заранее спасибо за ваше время , : -)
РЕДАКТИРОВАТЬ:
Я перекомпилировал код через несколько часов, и он работает сейчас. Я предполагаю, что это была какая-то ошибка со старым кодом, который не был должным образом перераспределен или что-то в этом роде ... Я также использую VS на Ma c, так что это также может быть причиной, поскольку он ведет себя с ошибками с самого первого дня ...
Кроме того, вот класс BindableBase (ComputedBindableBase ничего не делает, кроме добавления служебной функции):
public abstract class BindableBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void Set<T>(ref T target, T value, [CallerMemberName] string propertyName = "")
{
target = value;
RaisePropertyChanged(propertyName);
}
protected void RaisePropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}