Постоянно обновляемая метка в шаблоне ListView - PullRequest
0 голосов
/ 06 января 2019

У меня есть список объектов, которые я привязываю к ListView и использую DataTemplate для отображения в приложении Xamarin. Пока все довольно просто. Но главное, что я хочу, чтобы один из элементов управления (в частности, метка) постоянно обновлялся.

Пока это то, что у меня есть ...

    <ListView x:Name="ItemsListView"
              ItemsSource="{Binding Items}"
              VerticalOptions="FillAndExpand"
              HasUnevenRows="true"
              RefreshCommand="{Binding LoadItemsCommand}"
              IsPullToRefreshEnabled="true"
              IsRefreshing="{Binding IsBusy, Mode=OneWay}"
              CachingStrategy="RecycleElement"
              ItemSelected="OnItemSelected">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout Padding="10">
                        <Label Text="{Binding Title}"
                               LineBreakMode="NoWrap"
                               Style="{DynamicResource ListItemTextStyle}"
                               FontSize="16" />
                        <mycountdown:TimerLabel Text="{Binding TimeRemainingString}"
                                                Style="{DynamicResource ListItemDetailTextStyle}"
                                                FontSize="13" />
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

И код моего класса TimerLabel ...

public class TimerLabel : Label
{
    private bool beating;
    public TimerLabel()
    {
        StartHeartbeat();
    }

    public void StartHeartbeat()
    {
        //only start beating again if not currently beating.
        if (!beating)
        {
            beating = true;
            Heartbeat();
        }
    }

    public void StopHeartbeat()
    {
        beating = false;
    }

    async void Heartbeat()
    {
        while (beating)
        {
            this.Text = DateTime.UtcNow.ToLongTimeString();
        }
    }
}

Это работает , но проблема в том, что сердцебиение для каждого элемента в списке продолжает работать, даже когда я ухожу со страницы.

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

Проблема в том, что я не могу понять, как получить доступ к методу StopHeartbeat () из кода страницы или модели представления.

Это также не будет ограничено только ярлыками. В итоге у меня будет несколько других элементов управления, которые нужно постоянно обновлять в потоке пользовательского интерфейса, но это самый простой для начала.

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Ответ верхним комментарием в моем сообщении.

0 голосов
/ 07 января 2019

если вы являетесь Bind List в ListItem Source, пожалуйста, измените его с List на ObservableCollection , он будет работать, дайте мне знать, если возникнут вопросы, или вы можете загрузить Код ViewModel, а также

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