Как передать свойства навигации на Мауи?
У меня есть приложение Maui с представлением коллекции элементов и представлением сведений об элементе. Когда элемент нажимается в представлении коллекции, я хотел бы перейти к подробному представлению. Я использую навигацию Maui Shell. Код взят из приложения Xamarin, где он работал. Маршрут прописан в AppShell.xaml
В обработчике события касания на странице коллекции код позади
async void OnItemTapped(ItemViewModel itemVM)
{
string route =
$"//{nameof(ItemPage)}?{nameof(ItemPage.Id)}={itemVM.Id}";
await Shell.Current.GoToAsync(route);
}
При отладке я могу убедиться, что содержимое переменной route соответствует ожиданиям.
Код страницы сведений позади (отредактировано до соответствующих битов):
[XamlCompilation(XamlCompilationOptions.Compile)]
[QueryProperty(nameof(Id), nameof(Id))]
public partial class ItemPage : ContentPage, IDisposable
{
/// <summary>Navigation property to pass Id value.</summary>
public string Id { get; set; }
public TablePartyPage()
{
InitializeComponent();
}
protected override void OnAppearing()
{
base.OnAppearing();
// Id is populated by navigation.
string id = TablePartyId.FromUrlQueryValue(Id); /* Problem: Id is null here */
var viewModel = new ItemViewModel(
...
);
BindingContext = viewModel;
}
}
При выполнении GotoAsync() конструктора ItemPage выполняется ItemPage OnAppearing(), однако свойство навигации не заполняется.
Что мне не хватает?
Окружающая среда:
- Visual Studio 2022, версия 17.4.3
- Мауи v7
2 ответа
Вау, документ Maui Navigation, похоже, не указывает, когда применяются параметры запроса. Если они не применяются к тому времени, как это называется, это не очень хороший внутренний дизайн.
Вы можете добавить проблему в
Обходной путь заключается в удалении кода из
public string Id {
get => id;
set {
if (SetValue(ref id, value)) // Might be a different method, depending on MVVM implementation.
{
... use Id here ...
}
}
}
private string id;
Похоже на PITA, если передается несколько свойств, и все они должны быть установлены до запуска кода «использовать идентификатор». В этом случае пусть все установщики вызывают метод, который ничего не делает, пока все свойства не получат ожидаемое значение.
Похоже, это была проблема навигации, упомянутая в этом связанном вопросе: Как зарегистрировать маршрут навигации, не видимый в оболочке, в Maui Shell?
Исправлена навигация без оболочки, как было предложено в первом комментарии, и свойство навигации было заполнено.
Спасибо за все ваши предложения!