Я пытаюсь показать данные в динамически создаваемых сборщиках. Это мой код. Эти данные загружаются в модель представления, но они не отображаются в моем средстве выбора. Когда пользователь вводит «Количество ночей» как 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));
}
}
Объясните мне, где находится это «NightLocations»?
@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 есть свойство NightLocations, где оно находится?
Чтобы узнать об относительных привязках в MAUI, вы также можете обратиться к официальному документу Относительные привязки.
Для работы привязки к свойству в вашей 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 Я отредактировал свой ответ, чтобы он лучше соответствовал вашим требованиям (см. SelectedItem
на ur:PickerField). Просто используйте его так, как вы это делали изначально.
@AI Джон Большое спасибо!
Рад, что это сработало для вас!
Местоположение — это свойство вашей базовой виртуальной машины, а не каждого элемента в вашей коллекции. Поэтому вам необходимо использовать относительную привязку для средства выбора.