Как передать свойства навигации на Мауи?

У меня есть приложение 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?

Исправлена ​​навигация без оболочки, как было предложено в первом комментарии, и свойство навигации было заполнено.

Спасибо за все ваши предложения!

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