Средство выбора SelectedItem не обновляется при изменении значения в ViewModel Xamarin.Forms - PullRequest
0 голосов
/ 23 мая 2019

У меня есть ViewModel, которая должна обновлять элементы управления пользовательского интерфейса View в соответствии с данными из БД.Это происходит для корректного обновления элемента управления Entry, но мои средства выбора не получают обновленного Selection, даже если параметр изменяет значение в ViewModel ..

Вот код из Xaml View:

<Entry x:Name="TitleBox" Grid.Row="0" HorizontalOptions="FillAndExpand" Placeholder="Title" Text="{Binding Title, Mode=TwoWay}"/>
<Picker x:Name="TypeCombo" Title="Type" Grid.Row="2" SelectedItem="{Binding Type, Mode=TwoWay}" ItemsSource="{Binding FeaturedType}"/>

И ViewModel:

    public string Title
        {
            get => _Version.Title;
            set
            {
                if (_Version.Title != value)
                {
                    _Version.Title = value;
                    NotifyPropertyChanged("Title");
                }
            }
        }

    public string Type
        {
            get => _Version.Type;
            set
            {
                if (_Version.Type != value)
                {
                    _Version.Type = value;
                    NotifyPropertyChanged("Type");
                }
            }
        }

    #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion

В определенный момент в ViewModel _Version назначается объект из БД, а его заголовок и тип назначаются соответственно.

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

ObservableCollection<string> _featuredType;
    public ObservableCollection<string> FeaturedType
    {
        get => _featuredType;
        set
        {
            if (_featuredType != value)
            {
                _featuredType = value;
                NotifyPropertyChanged("FeaturedType");
            }
        }
    }

Я теряю голову здесь, поскольку эквивалент ComboBox в UWP работал без проблем, но мне пришлось перейти на Xamarin, поскольку я становлюсь зависимым от Android.

Вот как я привязываюсь к ViewModel:

public PageViewModel ViewModel { get; set; }
BindingContext = this.ViewModel = new PageViewModel();

Также я заметил, что при выполнении некоторого теста в коде, например, так:

            string testType = ViewModel.Type;
            string testTitle = ViewModel.Title;

возвращает правильный заголовокзначение, но значение типа приводит к нулю, даже если во ViewModel это было правильно.

1 Ответ

0 голосов
/ 23 мая 2019

Хорошо, я нашел решение, но я не уверен, почему мой предыдущий не сработал.

@ Sparsha Bhattarai направила меня в правильном направлении, в основном, чтобы избежать проблемы с заказом, я заполнил ItemsSource изв Xaml вместо кода во ViewModel, например:

<Picker.ItemsSource>
    <x:Array Type="{x:Type x:String}">
        <x:String>Type1</x:String>
        <x:String>Type2</x:String>
        <x:String>Type3</x:String>
    </x:Array>
</Picker.ItemsSource>

Это решило мою проблему, и средства выбора выбирают правильный SelectedItem из ViewModel.

Однако это не может быть большой помощьюесли бы я не знал, какие предметы доступны в Source.К счастью, в этом конкретном случае я могу заранее определить элементы сборщиков.Однако я хотел бы знать, почему он не работает с кодом в viewmodel.

...