Динамический сборщик .net MAUI не показывает данные

Я пытаюсь показать данные в динамически создаваемых сборщиках. Это мой код. Эти данные загружаются в модель представления, но они не отображаются в моем средстве выбора. Когда пользователь вводит «Количество ночей» как 2, генерируются 2 сборщика. Я не обнаружил здесь никаких проблем с загрузкой данных, только проблема не видна. У кого-нибудь есть идеи это исправить. Пожалуйста помоги.

НьюПостПаже.xaml

<?xml version = "1.0" encoding = "utf-8" ?>
<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:ur = "http://schemas.enisn-projects.io/dotnet/maui/uraniumui/material"
             x:Class = "DriveMeSL.View.NewPostPage"
             xmlns:vm = "clr-namespace:DriveMeSL.ViewModels"
             NavigationPage.HasNavigationBar = "True"
             Title = "New Post">
    <ContentPage.BindingContext>
        <vm:NewPostViewModel />
    </ContentPage.BindingContext>
    <ScrollView>
        <VerticalStackLayout VerticalOptions = "Center"
                             Margin = "20,0,20,0"
                             Spacing = "20">
            <Label Text = "Create Post"
                   TextColor = "#101010"
                   FontSize = "Large"
                   HorizontalOptions = "Center"/>   
            <ur:DatePickerField x:Name = "EntDate"
                                Title = "Date" />
            <ur:TimePickerField x:Name = "EntTime"
                                Title = "Pick a Time" />
            <StackLayout Padding = "20">
                <Label Text = "Enter Number of Nights:" />
                <Entry Text = "{Binding NoOfNights, Mode=TwoWay}" Keyboard = "Numeric" /> 
                <CollectionView ItemsSource = "{Binding NightLocations}">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <ur:PickerField Title = "Enter location"
                                            ItemsSource = "{Binding Locations}"
                                            ItemDisplayBinding = "{Binding LocationName}"
                                            SelectedItem = "{Binding SelectedLocation}" />
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>
            </StackLayout>
            <Button Text = "Save" Command = "{Binding SaveCommand}" />
            <Button x:Name = "BtnNewPost" StyleClass = "FilledButton" Text = "Add Post" Clicked = "BtnNewPost_Clicked" />
        </VerticalStackLayout>
    </ScrollView>
</ContentPage>

Ньюпостпаже.xaml.cs

    public partial class NewPostPage : ContentPage
    {
        private NewPostViewModel viewModel;
    
        public NewPostPage()
        {
            InitializeComponent();
    
            viewModel = new NewPostViewModel();
            BindingContext = viewModel;
    
            // Call the async method to load locations
            _ = LoadLocationsAsync();
        }
    
        private async Task LoadLocationsAsync()
        {
            await viewModel.LoadLocationsAsync();
        }
    } 
}

Ньюпоствиевмодел.cs

public class NewPostViewModel : INotifyPropertyChanged
{

    private ObservableCollection<Location> _locations;
    public ObservableCollection<Location> Locations
    {
        get => _locations;
        set
        {
            _locations = value;
            OnPropertyChanged(nameof(Locations));
        }
    }

    private Location _selectedLocation;
    public Location SelectedLocation
    {
        get { return _selectedLocation; }
        set
        {
            _selectedLocation = value;
            OnPropertyChanged(nameof(SelectedLocation));
        }

    }

   public async Task LoadLocationsAsync()
   {
       try
       {
           var locations = await ApiService.GetLocation(); // Replace with your actual API call
           Locations = new ObservableCollection<Location>(locations);
           OnPropertyChanged(nameof(Locations)); // Notify UI of change
       }
       catch (Exception ex)
       {
           // Handle exceptions or logging
           Console.WriteLine($"Error loading locations: {ex.Message}");
       }
   }

  protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
  {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  }
}

Местоположение — это свойство вашей базовой виртуальной машины, а не каждого элемента в вашей коллекции. Поэтому вам необходимо использовать относительную привязку для средства выбора.

Jason 29.06.2024 04:55

Объясните мне, где находится это «NightLocations»?

H.A.H. 02.07.2024 13:26

@H.A.H <Entry Text = "{Binding NoOfNights, Mode=TwoWay}" Keyboard = "Numeric" /> этот зарегистрированный пользователь вводит количество ночей, затем <DataTemplate> <ur:PickerField Title = "Введите местоположение" ItemsSource = "{Binding Locations}" ItemDisplayBinding = "{Binding LocationName}" SelectedItem = "{Binding SelectedLocation}" /> </DataTemplate> эти сборщики, генерируемые после этого

amnk 03.07.2024 05:02

@amnk есть свойство NightLocations, где оно находится?

H.A.H. 03.07.2024 11:34

Чтобы узнать об относительных привязках в MAUI, вы также можете обратиться к официальному документу Относительные привязки.

Liqun Shen-MSFT 10.07.2024 09:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для работы привязки к свойству в вашей ViewModel из элемента коллекции требуется относительная привязка.

CollectionView требуется атрибут имени. Затем вы можете использовать привязку для элементов, ссылаясь на контекст привязки представления коллекции.

<CollectionView ItemsSource = "{Binding NightLocations}"
                x:Name = "NightLocationsCollectionView">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <ur:PickerField Title = "Enter location"
                            ItemsSource = "{Binding Source = {x:Reference NightLocationsCollectionView}, Path=BindingContext.Locations}"
                            SelectedItem = "{Binding SelectedLocation}"
                            ItemDisplayBinding = "{Binding LocationName}"/>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

Спасибо, теперь данные о загрузке. Но если я создаю более одного раскрывающегося списка, во всех раскрывающихся списках отображается одно и то же выбранное значение. Если я выберу значение из первого раскрывающегося списка, второй раскрывающийся список покажет это значение. Если я выберу второй раскрывающийся список, он отобразится и в первом.

amnk 02.07.2024 09:54

@amnk Я отредактировал свой ответ, чтобы он лучше соответствовал вашим требованиям (см. SelectedItem на ur:PickerField). Просто используйте его так, как вы это делали изначально.

Al John 02.07.2024 16:40

@AI Джон Большое спасибо!

amnk 03.07.2024 16:29

Рад, что это сработало для вас!

Al John 03.07.2024 22:20

Другие вопросы по теме