Xamarin.Forms iOS Пикер, переходящий к последнему элементу после закрытия диалога - PullRequest
0 голосов
/ 13 марта 2020

Я только что столкнулся с этой проблемой в проекте, над которым я работаю, и нахожусь в тупике. Как видно из рисунка ниже, при выборе элемента в диалоговом окне «Выбор» на 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));
        }
    }

1 Ответ

0 голосов
/ 13 марта 2020

Я не могу воспроизвести эту проблему, используя Xamarin.Forms 4.5.0.356 и Xamarin.Essentials 1.5.1. Мой код функционально такой же, как ваш, за исключением того, что я не получил свою модель представления из ComputedBindableBase. Следующий код работает как положено

Просмотр

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:app2="clr-namespace:App3"
             mc:Ignorable="d"
             x:Class="App3.MainPage">
    <ContentPage.BindingContext>
        <app2:MainPageViewModel/>
    </ContentPage.BindingContext>

    <ContentPage.Content>
        <Picker Title="Please select..."
                ItemsSource="{Binding PickerItemModels}"
                SelectedItem="{Binding SelectedModel}" />
    </ContentPage.Content>
</ContentPage>

ViewModel

public class PickerItemModel
{
    public string TestProp { get; set; }
    public PickerItemModel(string t) => TestProp = t;
    public override string ToString() => TestProp;
}

public class MainPageViewModel
{
    public List<PickerItemModel> PickerItemModels { get; set; } = new List<PickerItemModel> {
        new PickerItemModel("Hello"),
        new PickerItemModel("Stackoverflow")
    };
    public PickerItemModel SelectedModel { get; set; }
}
...