Я новичок в платформе .NET MAUI, и у меня есть проблема.
Когда я пытаюсь передать данные между страницами моего приложения, выдается эта ошибка: System.ArgumentException: 'unable to figure out route for: PdfViewer?pdfName=EN 10305-2 Arg_ParamName_Name'
В моем приложении я хочу открывать файлы PDF в соответствии с выбором пользователя. Например, когда пользователь нажимает первую кнопку, приложение открывает первый PDF-файл. Когда пользователь сделает то же самое для второй кнопки, откроется второй файл PDF. Сейчас все работает, кроме этого. Обычно без передачи данных приложение переходит на нужную мне страницу, но когда я пытаюсь сделать это с передачей данных, оно выдает мне эту ошибку. Я делюсь кодами страниц ниже:
(я назвал свою главную страницу «АнаСайфа»)
АнаСайфа.xaml
<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit = "http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class = "borkatalogYeni.AnaSayfa"
Title = "Ana Sayfa"
BackgroundColor = "LightGray">
<Grid RowDefinitions = "Auto, Auto">
<Entry Grid.Row = "0" Placeholder = "Ara" TextChanged = "Entry_TextChanged"></Entry>
<CollectionView Grid.Row = "1" x:Name = "MyCollectionView"
ItemsSource = "{Binding UserItems}" SelectionMode = "Single"
SelectedItem = "{Binding SelectedListItem}">
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation = "Vertical" Span = "1" VerticalItemSpacing = "1"></GridItemsLayout>
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate>
<VerticalStackLayout VerticalOptions = "CenterAndExpand">
<Label Text = "{Binding Name}" TextColor = "Black"
VerticalOptions = "CenterAndExpand"></Label>
</VerticalStackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</Grid>
АнаСайфа.xaml.cs
namespace borkatalogYeni;
public partial class AnaSayfa : ContentPage
{
public class Item
{
public string Name { get; set; }
}
public List<Item> Items;
AnaSayfaViewModel anaSayfaViewModel;
public AnaSayfa()
{
InitializeComponent();
BindingContext = anaSayfaViewModel = new AnaSayfaViewModel();
}
void Entry_TextChanged(System.Object sender, Microsoft.Maui.Controls.TextChangedEventArgs e)
{
if (string.IsNullOrWhiteSpace(e.NewTextValue))
{
MyCollectionView.ItemsSource = anaSayfaViewModel.UserItems;
}
else
{
MyCollectionView.ItemsSource = anaSayfaViewModel.UserItems.Where(i => i.Name.ToLower().Contains(e.NewTextValue.ToLower()));
}
}
}
AnaSayfaViewModel.cs (Модель представления моей главной страницы)
namespace borkatalogYeni
{
public class AnaSayfaViewModel : BindableObject
{
public class UserItem
{
public string Name { get; set; }
}
private UserItem selectedListItem;
public UserItem SelectedListItem
{
get { return selectedListItem; }
set
{
if (selectedListItem != value)
{
selectedListItem = value;
OnPropertyChanged("SelectedListItem");
if (selectedListItem != null)
{
PerformNavigation(selectedListItem.Name);
}
}
}
}
private async void PerformNavigation(string GetName)
{
//I'm getting the error in here
await Shell.Current.GoToAsync($"{nameof(PdfViewer)}?pdfName = {GetName}");
}
private ObservableCollection<UserItem> userItems;
public ObservableCollection<UserItem> UserItems
{
get
{
return userItems;
}
set
{
if (userItems != value)
{
userItems = value;
OnPropertyChanged("UserItems");
}
}
}
public AnaSayfaViewModel()
{
UserItems = new ObservableCollection<UserItem>
{
new UserItem{Name = "EN 10305-2"},
new UserItem{Name = "EN 10305-3"},
new UserItem{Name = "EN 10305-5"}
};
}
}
}
PdfViewer.xaml (на этой странице я открываю PDF-файлы)
<?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:toolkit = "http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class = "borkatalogYeni.PdfViewer"
Title = "PdfViewer">
<Grid>
<WebView x:Name = "webViewPdf"
Grid.Row = "1"
HorizontalOptions = "Fill"
VerticalOptions = "Fill"/>
</Grid>
PdfViewer.xaml.cs
public partial class PdfViewer : ContentPage
{
public PdfViewer(PdfViewerViewModel vm)
{
InitializeComponent();
BindingContext = vm;
//In here, I wanted to open PDF files with the data that I tried to bring from main page
//string pdfName = "";
//webViewPdf.Source = pdfName + ".pdf";
//this.Title = pdfName;
}
}
PdfViewerViewModel.cs (Просмотр модели страницы PdfViewer)
namespace borkatalogYeni
{
//After integrated view model, I tried to pass data to here but unfortunately I'm failed
[QueryProperty("pdfName", "pdfName")]
public partial class PdfViewerViewModel : ObservableObject
{
[ObservableProperty]
string pdfName;
}
}
@ Джейсон Я удалил пробелы из имен, я сделал это как EN10305-2, но снова выдал ту же ошибку.
Пожалуйста, зарегистрируйте маршрут для своей страницы. Вы можете прописать маршрут в файл AppShell.xaml.cs
Основываясь на вашем коде, я создал демо и реализовал эту функцию. Вы можете обратиться к следующему коду:
AppShell.xaml.cs
public partial class AppShell : Shell
{
public Dictionary<string, Type> Routes { get; private set; } = new Dictionary<string, Type>();
public AppShell()
{
InitializeComponent();
RegisterRoutes();
}
void RegisterRoutes()
{
Routes.Add("pdfviewer", typeof(PdfViewer));
foreach (var item in Routes)
{
Routing.RegisterRoute(item.Key, item.Value);
}
}
}
PfViewer.xaml.cs
[QueryProperty("pdfName", "pdfName")]
public partial class PdfViewer : ContentPage
{
public string pdfName
{
set
{
LoadData(value);
}
}
private void LoadData(string value)
{
System.Diagnostics.Debug.WriteLine("---> received data is: "+value);
try
{
BindingContext = new PdfViewerViewModel(value);
this.Title = value;
}
catch (Exception)
{
Console.WriteLine("Failed to load data.");
}
}
public PdfViewer()
{
InitializeComponent();
// BindingContext = vm;
//In here, I wanted to open PDF files with the data that I tried to bring from main page
//string pdfName = "";
//webViewPdf.Source = pdfName + ".pdf";
//this.Title = pdfName;
}
}
PdfViewerViewModel.cs
public partial class PdfViewerViewModel: ObservableObject
{
[ObservableProperty]
string pdfName;
public PdfViewerViewModel(string name) {
this.pdfName = name;
}
}
В AnaSayfaViewModel.cs
измените метод PerformNavigation
следующим образом:
private async void PerformNavigation(string GetName)
{
await Shell.Current.GoToAsync($"pdfviewer?pdfName = {GetName}");
}
попробуйте удалить пробелы из имен или закодировать их