Пользовательский интерфейс не обновляется в реальном времени - PullRequest
0 голосов
/ 25 января 2019

У меня есть просмотр списка для отображения всех элементов, которые я получаю от api.i, у меня есть прямое событие, которое изменит одно поле внутри элемента типа observablecollection

<?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="Dyocense.Views.ManageJobs"
             Title="All jobs">
    <ContentPage.ToolbarItems>
        <ToolbarItem Text="ADD" Clicked="AddJob"></ToolbarItem>
    </ContentPage.ToolbarItems>
    <ContentPage.Content>
        <StackLayout>
            <SearchBar x:Name="Search" SearchButtonPressed="SearchBar_SearchButtonPressed"></SearchBar>
            <ListView x:Name="JobsListView"   
             ItemsSource="{Binding Items}"
             VerticalOptions="FillAndExpand"
             HasUnevenRows="true"
             CachingStrategy="RecycleElement"
             ItemAppearing="BrowseJobList_ItemAppearing"
             IsPullToRefreshEnabled="true"
             >
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <StackLayout Padding="10">
                                <Frame HasShadow="True" >
                                    <StackLayout>
                                        <Grid>
                                           <Grid.RowDefinitions>
                                                <RowDefinition Height="*" />
                                                <RowDefinition Height="*" />
                                                <RowDefinition Height="*" />
                                                <RowDefinition Height="*" />
                                                <RowDefinition Height="*" />
                                                <RowDefinition Height="*" />
                                                <RowDefinition Height="*" />
                                            </Grid.RowDefinitions>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*" />
                                                <ColumnDefinition Width="*" />
                                                <ColumnDefinition Width="*" />
                                            </Grid.ColumnDefinitions>

                                        <Label Text="{Binding Name}" 
                                               Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" 
                                               FontSize="Medium"
                                               FontAttributes="Bold"/>
                                        <Label Text="Status" 
                                               Grid.Row="1" Grid.Column="0"
                                               FontSize="16"
                                               FontAttributes="Bold"/>
                                        <Label Text="{Binding Status}" 
                                               Grid.Row="1" Grid.Column="1"
                                               FontSize="16"/>
                                        <Label Text="Goal" 
                                               Grid.Row="2" Grid.Column="1"
                                               FontSize="16"
                                               FontAttributes="Bold"/>
                                        <Label Text="{Binding Goal}" 
                                               Grid.Row="2" Grid.Column="2"
                                               FontSize="16" />
                                        <Label Text="Part" 
                                               Grid.Row="3" Grid.Column="1"
                                               FontSize="16"
                                               FontAttributes="Bold"/>
                                        <Label Text="{Binding PartName}" 
                                               Grid.Row="3" Grid.Column="2"
                                               FontSize="16" />
                                        <Label Text="Assembly" 
                                               Grid.Row="4" Grid.Column="1"
                                               FontSize="16"
                                               FontAttributes="Bold"/>
                                        <Label Text="{Binding NodeName}" 
                                               Grid.Row="4" Grid.Column="2"
                                               FontSize="16" />
                                        <Label Text="GoodCount" 
                                               Grid.Row="5" Grid.Column="0"
                                               FontSize="16"
                                               FontAttributes="Bold"/>
                                        <Label Text="{Binding GoodCount}" 
                                               Grid.Row="6" Grid.Column="0"
                                               FontSize="16"
                                               HorizontalTextAlignment="Center"/>
                                        <Label Text="RejectCount" 
                                               Grid.Row="5" Grid.Column="1"
                                               FontSize="16"
                                               FontAttributes="Bold"/>
                                        <Label Text="{Binding RejectCount}" 
                                               Grid.Row="6" Grid.Column="1"
                                               FontSize="16" 
                                               HorizontalTextAlignment="Center"/>
                                        <Label Text="DownTimeCount" 
                                               Grid.Row="5" Grid.Column="2"
                                               FontSize="16"
                                               FontAttributes="Bold"/>
                                        <Label Text="{Binding DownTimeCount}" 
                                               Grid.Row="6" Grid.Column="2"
                                               FontSize="16" 
                                               HorizontalTextAlignment="Center"/>
                                        </Grid>
                                    </StackLayout>

                                </Frame>
                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
                <ListView.Footer>
                    <Grid Padding="6" IsVisible="{Binding IsBusy}">
                         <!--set the footer to have a zero height when invisible--> 
                        <Grid.Triggers>
                            <Trigger TargetType="Grid" Property="IsVisible" Value="False">
                                <Setter Property="HeightRequest" Value="0" />
                            </Trigger>
                        </Grid.Triggers>
                         <!--the loading content--> 
                        <Label Text="Loading..." VerticalOptions="Center" HorizontalOptions="Center" />
                    </Grid>
                </ListView.Footer>
            </ListView>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

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

public class JobViewModel: INotifyPropertyChanged
    {
        private ObservableCollection<Job> items;

        public event PropertyChangedEventHandler PropertyChanged;


        public ObservableCollection<Job> Items
        {
            get { return items; }
            set
            {

                items = value;
                if (items != value)
                {
                    items = value;
                    OnPropertyChanged(nameof(Items));
                }
            }
        }
 protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
}
}
private void updateJoblistOnEvent(NotificationEntity message)
        {
            var jobId = message.JobId;
            Job job = Items.FirstOrDefault(a => a.JobId.Equals(jobId));

            switch (message.EventCode)
            {


                case MessageTypeEnum.Pulse: //Pulse
                job.GoodCount = job.GoodCount + 1;

                //job.Status = 'Running';
                break;
                default:
                    break;
            }
        }

Я подозреваю две вещи

  1. CachingStrategy = "RecycleElement" я удалил этот, который также не обновляется с помощью прокрутки
  2. любая проблема с INotifyPropertyChanged, я пытался удалить один элемент из списка, его работающий и обновляющий интерфейс. Я хочу обновить поле внутри элемента может ли кто-нибудь помочь мне

1 Ответ

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

Как следует из комментариев, вам также необходимо реализовать интерфейс INotifyPropertyChanged для объекта Job.Использование ObservableCollection помогает только для изменений в этой коллекции, поэтому при удалении или добавлении объекта Job, а не при изменении внутри объекта Job.

Итак,в вашем Job объекте сделайте это (код, обратный инженерии из того, что вы опубликовали):

public class Job : INotifyPropertyChanged
{
   private int goodCount;
   public int GoodCount
   {
       get { return goodCount; }
       set
       {
           if (goodCount != value)
           {
               goodCount = value;
               OnPropertyChanged(nameof(GoodCount));
            }
        }
    }

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

Вы можете удалить INotifyPropertyChanged из вашего JobViewModel, но вам, вероятно, он понадобится в какой-то момент, какхорошо

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