В методе AddToList
вы пытаетесь преобразовать первого дочернего элемента MainPage
в SearchPage
. В любом случае, в вашем XAML первый дочерний элемент в <TabbedPage.Children>
- это NavigationPage
, который, конечно, не является производным от вашего SearchPage
, поэтому не может быть приведен, и выдается InvalidCastException
.
Если вы действительно хотите сделать это таким образом (изучение MVVM прямо сейчас может быть полезно, но если вы действительно хотите изучить его трудным путем, это нормально для меня), вы бы должны получить доступ к NavigationPage
, а затем к его CurrentPage
public async void AddToList()
{
var mainPage = (MainPage)App.Current.MainPage;
var navigationPage = (NavigationPage)mainPage.Children[0];
if (navigationPage.CurrentPage is SearchPage searchPage)
{
var Word = searchPage.WordSearchBar.Text;
...
}
}
Я ввел безопасное приведение с сопоставлением с образцом, потому что NavigationPage.CurrentPage
может быть изменен (в отличие от MainPage
и the NavigationPage
), и мы не хотим, чтобы наше приложение выскакивало sh только потому, что на странице навигации активна неправильная страница.
Обратите внимание, что таким образом ваши страницы очень тесно связаны, что обычно считается не очень хорошей вещью. Даже без MVVM вам следует подумать о разделении страниц, например, с помощью MessagingCenter
, см. Учебник Xamarin.Forms по слабосвязанным компонентам . В любом случае, вам следует подумать о внедрении интерфейсов для ваших страниц в этом случае, поскольку MessagingCenter
требует типа отправителя, что снова приведет к некоторой жесткой связи. Отправка поискового текста в другой компонент может быть достигнута путем вызова
MessagingCenter.Send<ISearchPage, string>(this, MessengerKeys.SearchTextChanged, searchText);
Но что именно было бы разумным, сильно зависит от вашего приложения и может быть лучший способ.