Динамическая связь XAML с кодом - PullRequest
0 голосов
/ 06 июня 2018

Небольшая справочная информация

Я изучаю Xamarin.Forms и в настоящее время немного борюсь с динамическим связыванием моего XAML ContentPage с моим кодом.Очевидно, я полностью осознаю, как следует писать Xamarin.Form, поэтому я надеюсь, что вы можете потерять сознание из-за моего небольшого замешательства.

Я занимаюсь разработкой мобильного приложения для Android и использую BottomNavigationBarXF , чтобы поместить панель навигации внизу, которая работает хорошо.В настоящее время я использую пример проекта для моего обучения.

Актуальная проблема

Я создал серию ContentPage, которые я хотел бы динамическипара при создании каждой новой страницы.У моих ContentPage есть соответствующий код, который я оставил нетронутым;Например, у меня есть ContentPage с именем HomePage, у которого есть этот код:

namespace BottomBarXFExample
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class HomePage : ContentPage
    {
        public HomePage()
        {
            InitializeComponent();
        }
    }
 }

и соответствующий ему XAML:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="BottomBarXFExample.HomePage">
<ContentPage.Content>
    <StackLayout>
        <Label Text="Welcome to Xamarin.Forms!"
            VerticalOptions="CenterAndExpand" 
            HorizontalOptions="CenterAndExpand" />
    </StackLayout>
</ContentPage.Content>

Я создаю страницы следующим образом.

 string[] tabTitles = { "Me", "Trends", "Home", "Plan", "About" };

        ContentPage[] pages = new ContentPage[tabTitles.Length];

        for (int i = 0; i < tabTitles.Length; ++i)
        {
            ContentPage page = createPage(tabTitles[i]);
            bottomBarPage.Children.Add(page);
        }

Метод createPage:

private ContentPage createPage(String title)
    {

        FileImageSource icon = setIcon(title);

        ContentPage page = new ContentPage()
        {
            Title = title,
            Icon = icon,
        };

        // should something happen here with the XAML?
        return page;
    }

И метод setIcon:

private FileImageSource setIcon(String title)
    {
        FileImageSource icon = (FileImageSource)FileImageSource.FromFile(
            string.Format(
                "ic_" + title.ToLowerInvariant() + ".png",
                title.ToLowerInvariant()
                ));

        return icon;
    }

Используя этот подход, я успешно создал нижнюю панель навигации.Однако при переходе на каждую страницу с помощью панели навигации представление «очевидно» пусто, поскольку я не связываю ContentPage с соответствующим XAML.Можно ли это сделать в коде?

Если я выберу для каждого экземпляра ContentPage «правильный» путь:

HomePage homePage = new HomePage()
        {
            Title = "Home",
            Icon = homeIcon
        };

А затем добавьте их на панель навигации следующим образом:

bottomBarPage.Children.Add(homePage)

Я получаю связь между XAML и кодом.Тем не менее, я нахожу это довольно утомительным, и, вероятно, также ненужным, чтобы сделать это таким образом.

Есть предложения?

Спасибо,

Крис

1 Ответ

0 голосов
/ 06 июня 2018

Страницы Xaml и код позади классов тесно связаны в файле xaml с определением x:Class.Страницы Xaml не могут быть унаследованы, но классы ContentPage могут, но я не вижу решения этих проблем.Если вы ищете только одну страницу xaml, вам придется создать логику рендеринга в коде, например,

public HomePage(string title)
{
    InitializeComponent();

    switch(title)
    {
       // set Binding Context to your VM
       ... BindingContext = titleBasedVM;
    }
}

Ваша виртуальная машина может содержать данные, специфичные для страницы.Эта концепция использует MVVM , что настоятельно рекомендуется при использовании форм Xamarin.

Также обратите внимание на ControlTemplate для рендеринга общих разделов страницы.

Не следует пытаться динамически генерировать xaml, поскольку он не поддерживается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...