Счетчик тэгов ToolbarItems будет равен 0 в viewmodel - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь привязать количество значков в элементе панели инструментов из моей модели представления.

Но каждый раз, когда количество элементов панели инструментов становится равным 0 в моей модели представления.как 1.

Menupage.xml

<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage  xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyApp.Views.MenuPage"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             xmlns:b="clr-namespace:Prism.Behaviors;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True" 
             xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core"
             xmlns:views="clr-namespace:MyApp.Views"
             BarBackgroundColor="White"
             android:TabbedPage.ToolbarPlacement="Bottom"
             android:TabbedPage.BarSelectedItemColor=" #388e3c"
             android:TabbedPage.IsSwipePagingEnabled="False">
    <TabbedPage.ToolbarItems>
        <ToolbarItem Name="MenuItem1" Order="Primary" Icon="ic_notifications_active_white.png" Text="Item 1" Priority="0" Command="{Binding NotificationsNavigateCommand}" />
    </TabbedPage.ToolbarItems>

    <NavigationPage.TitleView>
        <StackLayout>
            <Image Source="dropdown.png" VerticalOptions="Center" HeightRequest="25"/>
        </StackLayout>
    </NavigationPage.TitleView>

    <views:A Title="A" Icon="outline_home_black_18dp.png" />

    <TabbedPage Title="status" Icon="icons8_bar_chart.png">
        <views:B Title="B"></views:B>
        <views:C Title="C"></views:C>
    </TabbedPage>
</TabbedPage>

menupageviewmodel.cs

public class MenuPageViewModel : ContentPage, INavigatedAware
{
    public MenuPageViewModel(INavigationService navigationService)
    {
        _navigationService = navigationService;

        LoadCount();
    }

    private async void LoadCount()
    {
        if (ToolbarItems.Count > 0)
            try
            {
                var toolbarservice = DependencyService.Get<IToolbarItemBadgeService>();


                toolbarservice.SetBadge(this, ToolbarItems.First(), "1", Color.Red, Color.White);
            }
            catch (Exception ex)
            {
                throw ex;
            }
    }

    public void OnNavigatedFrom(INavigationParameters parameters)
    {
        throw new NotImplementedException();
    }

    public void OnNavigatedTo(INavigationParameters parameters)
    {
        //if (ToolbarItems.Count > 0)
        //{
        //    try
        //    {
        //        //ToolbarItems =new MenuPage.ToolbarItems();

        //        var toolbarservice = DependencyService.Get<IToolbarItemBadgeService>();

        //        toolbarservice.SetBadge(this, ToolbarItems.First(), "1", Color.Red, Color.White);
        //    }
        //    catch (Exception ex)
        //    {
        //        throw ex;
        //    }
        //}
    }
}

я думаю, что его загрузка pblm мой вид загружается после того, как viewmodel.i попробовал призму OnNavigatedFromКроме того, результат тот же. Еще один вопрос, связанный с загрузкой, заключается в том, что моему приложению требуется больше времени на открытие, потому что viewmodel для каждой страницы срабатывает. Как ограничить загрузку только страницы сведений первой вкладки при открытии приложения

1 Ответ

1 голос
/ 03 июня 2019

Я думаю, что архитектура вашего проекта должна быть такой:

await NavigationService.NavigateAsync("NavigationPage/MenuPage");

Сделайте вашу корневую страницу с вкладками обернутой базовой страницей навигации. Я не рекомендую вам использовать эту иерархию. Это заставит все ваши страницы отображать тот же ToolbarItems, который вы создали на своей корневой вкладке.

Но если вам нужно это использовать, вы можете позволить вашей модели представления реализовать IPageLifecycleAware и получить счетчик там:

public class MenuPageViewModel : ViewModelBase, IPageLifecycleAware
{
    public MenuPageViewModel(INavigationService navigationService)
        : base(navigationService)
    {
        //LoadCount();
    }

    private async void LoadCount()
    {
        NavigationPage navigationPage = Application.Current.MainPage as NavigationPage;
        var tabbpedPage = navigationPage.Navigation.NavigationStack.FirstOrDefault();
        var count = tabbpedPage.ToolbarItems.Count;

        if (count > 0)
        try
        {
            var toolbarservice = DependencyService.Get<IToolbarItemBadgeService>();

            toolbarservice.SetBadge(tabbpedPage, tabbpedPage.ToolbarItems.FirstOrDefault(), "1", Color.Red, Color.White);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    public void OnAppearing()
    {
        LoadCount();
    }

    public void OnDisappearing()
    {

    }
}

Однако я по-прежнему не рекомендую вам обращаться к материалам, связанным с видом, в вашей модели вида. Более того, не заставляйте вашу модель представления наследоваться от ContentView, это не имеет смысла.

...