Это функция, которая меняет местоположение:
string restaurantId = (string)e.Parameter;
Console.WriteLine(restaurantId);
await Shell.Current.GoToAsync($"location?restaurantId = {restaurantId}");
Param не undefined и там он консольный. И страница меняется, но параметр запроса - пустая строка:
[QueryProperty("RestaurantId", "restaurantId")]
internal partial class LocationModel : ObservableObject
{
[ObservableProperty]
public string restaurantId;
public LocationModel()
{
Console.WriteLine(RestaurantId); // EMPTY
}
}
Здесь AppShell.cs
регистрируются маршруты:
public partial class AppShell : Shell
{
public AppShell()
{
InitializeComponent();
Routing.RegisterRoute("login", typeof(LoginPage));
Routing.RegisterRoute("home", typeof(MainPage));
Routing.RegisterRoute("location", typeof(LocationPage));
}
}
Что я делаю не так?
@ Джейсон, тогда как мне передать параметр и гарантированно получить его?
Вы просто не должны предполагать, что свойство будет доступно в конструкторе. Если вам абсолютно необходимо иметь значение в конструкторе, передайте его как параметр, а не свойство навигации.
Читайте дальше в документе Maui Shell Navigation. В нем упоминаются как минимум два способа обработки параметров запроса.
Параметры запроса должны быть определены в представлениях (точнее, страницах), а не в моделях или вьюмоделях, как описано в документации. Свойство никогда не устанавливается в вашем сценарии, потому что вам нужно получить его в своем представлении, а затем передать его в ViewModel/Model. Где определена ваша Страница? Можете ли вы показать код своей страницы и где вы настраиваете маршруты?
Один из способов исправить это — использовать [QueryProperty]
на вашей LocationPage
(Странице), а не на LocationModel
(ViewModel), а затем передать его со страницы на ViewModel.
LocationPage.xaml.cs
[QueryProperty(nameof(Id), "restaurantId")]
public partial class LocationPage : ContentPage
{
private LocationModel _viewModel;
public string Id
{
set => _viewModel.RestaurantId = value;
}
public LocationPage()
{
InitializeComponent();
BindingContext = _viewModel = new LocationModel();
}
}
РасположениеМодель
public partial class LocationModel : ObservableObject
{
[ObservableProperty]
public string restaurantId;
}
Таким образом, вы можете получить параметр запроса и передать его ViewModel. Вам придется реализовать логику загрузки данных во ViewModel в соответствии с переданным RestaurantId
самостоятельно. Вы также можете сделать это с помощью метода, такого как Load(string restaurantId)
, вместо использования свойства.
Подробнее о том, как работают параметры запроса, вы можете прочитать в официальной документации.
Не гарантируется, что свойства будут установлены в конструкторе