Xamarin формирует Listview - пользовательский интерфейс не обновляется при обновлении ObservableRangeCollection - PullRequest
0 голосов
/ 03 мая 2018

У меня есть список с несколькими шаблонами данных. Одним из шаблонов является простое текстовое поле и кнопка для сканирования штрих-кода (ZXingLibrary). Страница со списком отображается модально. На странице отображается вопрос со списком ответов, привязанных к представлению списка. Шаблон типа штрих-кода является одним из таких ответов.

Я обновляю коллекцию наблюдаемых диапазонов, привязанную к представлению списка в следующем коде. Эта функция вызывается после успешного сканирования штрих-кода.

private void UpdateUserResponseList(UserResponse obs, string result)
    {
        var temp = obs;
        obs.RValue = result;
        ObsList.Remove(temp);
        ObsList.Add(obs);
     }

Когда пользовательский интерфейс обновляет индексы списка, изменяется на обеих платформах. Это прекрасно работает в iOS. Но в Android пользовательский интерфейс обновляется только тогда, когда счетчик ObsList больше 1. Он сохраняет значение в коллекции, но не отображается / не обновляется в текстовом поле.

ListView

 <ListView x:Name="ObsListView" IsVisible="{Binding IsObservations}" CachingStrategy="RecycleElement" Margin="20" ItemsSource="{Binding ObsList}" SeparatorVisibility="None" HasUnevenRows="true" BackgroundColor="Transparent" 
    ItemTemplate="{StaticResource ObservationDataEntrySelector}" />

ObservableRangeCollection

public ObservableRangeCollection<UserResponse> ObsList 
{ 
     get 
       { return _obsList; } 
     set 
       { 
          if (_obsList != value) 
          { 
             _obsList = value; 
             OnPropertyChanged("ObsList"); } } 
       }
 }

Функция вызывается, когда пользователь нажимает Сканирование штрих-кода * Кнопка 1020 *

private void BarcodeScannerExecuted(UserResponse obj)
    {
        ZXingScannerPage scanPage = new ZXingScannerPage();
        var customOverlay = new StackLayout
        {
            HorizontalOptions = LayoutOptions.FillAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand

        };

        var Cancel_Button = new Button
        {
            Text = "Cancel",
            Command = CancelScanningCommand,
            HorizontalOptions = LayoutOptions.CenterAndExpand,

        };

        var Text_shown = new Label
        {
            Text = "Hold your device up to the barcode,Scanning will happen automatically",
            TextColor = Xamarin.Forms.Color.DarkRed,
            HorizontalOptions = LayoutOptions.CenterAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand

        };

        customOverlay.Children.Add(Cancel_Button);
        customOverlay.Children.Add(Text_shown);
        scanPage = new ZXingScannerPage(customOverlay: customOverlay);
        scanPage.OnScanResult += (result) =>
        {
            scanPage.IsScanning = false;
            Xamarin.Forms.Device.BeginInvokeOnMainThread(async () =>
            {
                UpdateUserResponseList(obj, result.Text);
                await _navigation.NavigatePopModalAsync();
            });
        };
        _navigation.NavigatePushModalAsync(scanPage);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...