Как обновить счетчик значков в родительской вкладке xamarin формы - PullRequest
0 голосов
/ 06 июня 2019

У меня есть приложение, которое использует страницы с вкладками, В xaml на странице вкладки Родитель Я заполняю все остальные мои вкладки, у меня есть view-модель, которая привязывается к вкладке Parent и view-модели для каждой из других вкладок. У меня есть значок на одной из вкладок, который имеет счетчик, который показывает, сколько сообщений есть. У меня проблемы с обновлением счетчика.

Итак, у меня есть вызов, чтобы получить количество непрочитанных сообщений из базы данных, которая загружается в счетчик при загрузке приложения. Когда я перемещаюсь, чтобы просмотреть сообщение, которое обновляет базу данных о том, что сообщение было прочитано, я затем возвращаюсь обратно на страницу с вкладками с помощью popasync, затем я нажимаю, чтобы обновить, который выполняет вызов, чтобы получить количество прочитанных сообщений, но оно не обновляется. счетчик, если я ставлю точку останова на метод GetCounter, я вижу, что он обновляет счетчик на нужную величину, но не меняет значок.

Надеюсь, это имеет смысл.

Если кто-то может помочь, я буду очень благодарен.

Основная вкладка Страница:

<NavigationPage Title="Message" Icon="email.png"  plugin:TabBadge.BadgeText="{Binding counter}" 
             plugin:TabBadge.BadgeColor="Red"
             plugin:TabBadge.BadgePosition="PositionTopRight"
             plugin:TabBadge.BadgeTextColor="Green">
    <x:Arguments>
        <local:MessagePage  BindingContext="{Binding messages}" />
    </x:Arguments>
</NavigationPage>



public partial class MasterTabPage : TabbedPage
{
    Master_PageViewModel vm;
    public MasterTabPage ()
    {
        InitializeComponent ();
        this.BindingContext = vm = new Master_PageViewModel(Navigation);
    }
}

Основная вкладка ViewModel:

 public class Master_PageViewModel : INotifyPropertyChanged
{
    INavigation Navigation;
    private int _counter;
    public int counter
    {
        get => _counter;
        set
        {
            _counter = value;
            OnPropertyChanged(nameof(counter));

        }
    }
    public MessagePageViewModel messages { get; set; }
    public Master_PageViewModel(INavigation navigation)
    {
        Navigation = navigation;
        messages = new MessagePageViewModel(Navigation);
        Init();
        counter = 0;
    }
    public async void Init()
    {
        await GetCounter();
    }
    public async Task GetCounter()
    {
        try
        {
            using (HttpClient client = new HttpClient())
            {
                List<MessageModel> msg = new List<MessageModel>();

                using (HttpResponseMessage response = await client.GetAsync("http://localhost:53665/api/GetMessagesCount/Id=" + 2 + "/" ))
                {
                    if (response.IsSuccessStatusCode)
                    {
                        using (HttpContent content = response.Content)
                        {
                            var textresponse = await content.ReadAsStringAsync();
                            var json = JsonConvert.DeserializeObject<List<MessageModel>>(textresponse);
                            foreach (var i in json)
                            {
                                msg.Add(new MessageModel
                                {
                                    msgCounter = i.msgCounter,
                                });
                            }
                            counter = msg[0].msgCounter;
                        }
                    }
                    else
                    {

                    }
                }
            }
        }
        catch (Exception)
        {

        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

Вкладка сообщений ViewModel:

public class MessagePageViewModel : BaseViewModel
{

    public ICommand MessageDetailsCommand { get; set; }
    INavigation Navigation;

    private ObservableCollection<MessageModel> _messagesList;
    public ObservableCollection<MessageModel> MessagesList
    {
        get { return _messagesList; }
        set
        {
            if (_messagesList != value)
            {
                _messagesList = value;
            }
        }
    }

    public ICommand ReloadCommand { get; set; }
    public ICommand RefreshCommand
    {
        get
        {
            return new Command(async () =>
            {
                await GetMessages();
                Master_PageViewModel vm = new Master_PageViewModel(Navigation,multiMediaPickerService);
                await vm.GetCounter();
            });
        }
    }

    bool _isBusy;
    public bool IsBusy
    {
        get { return _isBusy; }
        set
        {
            _isBusy = value;

        }
    }
    public MessagePageViewModel(INavigation navigation)
    {


        ReloadCommand = new Command(async () => await ReloadPage());

        Navigation = navigation;
        MessageDetailsCommand = new Command(async (object obj) => await MessageDetails(obj));
        Initialize();

    }

    private async void Initialize()
    {

        await GetMessages();

    }

    private async Task ReloadPage()
    {
        await GetMessages();
    }


    public async Task GetMessages()
    {
        List<MessageModel> msg = new List<MessageModel>
           .........
        MessagesList = new ObservableCollection<MessageModel>(msg);

    }

    private async Task MessageDetails(object obj)
    {
        var item = (obj as MessageModel);

        await Navigation.PushAsync(new MessageDetailsPage(....));
    }

    }
    }
}

1 Ответ

2 голосов
/ 07 июня 2019

Это потому, что вы создали новый экземпляр Master_PageViewModel в вашем RefreshCommand. Это не контекст привязки родительской страницы с вкладками, поэтому значок вкладки не будет обновляться, даже если сработал GetCounter.

Вы должны передать родительскую модель представления с вкладками вашему MessagePageViewModel, например:

public Master_PageViewModel(INavigation navigation)
{
    Navigation = navigation;
    messages = new MessagePageViewModel(Navigation, this);
    Init();
    counter = 0;
}

И измените конструктор модели представления страницы вашего сообщения:

Master_PageViewModel parentViewModel
public MessagePageViewModel(INavigation navigation, Master_PageViewModel viewModel)
{
    ReloadCommand = new Command(async () => await ReloadPage());

    Navigation = navigation;
    parentViewModel = viewModel;

    // ...
}

Наконец, запустите метод в вашей команде обновления:

public ICommand RefreshCommand
{
    get
    {
        return new Command(async () =>
        {
            await GetMessages();
            await parentViewModel.GetCounter();
        });
    }
}

Более того, я заметил, что ваш MessagePageViewModel использовал навигацию родительской модели представления с вкладками. Я не думаю, что это хороший подход, поскольку у него есть своя NavigationPage, так что он должен использовать собственную навигацию вместо родительской.

...