ObservableCollection не привязывается в CodeBehind - PullRequest
0 голосов
/ 17 марта 2019

ObservableCollection не привязывает Привет, ребята,

Мне нужна помощь в одном вопросе об использовании ObservableCollection в формах Xamarin.Мне нужно построить один "Custom ListView" для TabIndex работает правильно на моем экране.Для этого я создаю в коде: - ScrollView - Метка - Запись

Рендеринг экрана работает нормально, только моя проблема заключается в связывании в одной ObservableCollection.

Я тестирую одно свойство одной строкой, используяOnPropertyChanged работает правильно, но использование ObservableCollection не работает.Я пытался использовать CollectionChanged, но безуспешно.

У кого-то возникла такая же проблема?Существующее решение для этого?

ViewModel:

    private ObservableCollection<RawData> rawDataList;
    public ObservableCollection<RawData> RawDataList
    {
        get { return rawDataList; }
        set { rawDataList = value; OnPropertyChanged("RawDataList"); }
    }

Код позади

    private void BuildRawDataTemplate()
    {
        var grid = BuildGrid();

        #region Templates
        grid.Children.Add(BuildScheduleHeaderTitleTemplate(), 0, 0); // Posição: Coluna: 0 | Linha: 0
        grid.Children.Add(BuildScheduleDetailsSubtitleTemplate("Dados Brutos"), 0, 1); // Posição: Coluna: 0 | Linha: 1
        #endregion

        #region RawData
        var scrollView = BuildScrollView();
        var stackLayout = BuildStackLayout("DefaultLight", 10, StackOrientation.Vertical, null, LayoutOptions.Center);

        rawDataCount = scheduleViewModel.RawDataList.Count();
        foreach (var item in scheduleViewModel.RawDataList.Select((rawData, i) => new { i, rawData }))
        {
            stackLayout.Children.Add(GenerateLabel(item.rawData.Identification));

            if (item.rawData.InfoTypeId == (int)InfoType.Equipment)
                stackLayout.Children.Add(GenerateEquipmentsPicker(item.rawData, item.i, item.i == 0, rawDataCount == (item.i + 1)));
            else
                stackLayout.Children.Add(GenerateEntry(item.rawData, item.i, item.i == 0, rawDataCount == (item.i + 1)));
        }
        scrollView.Content = stackLayout;

        grid.Children.Add(scrollView, 0, 2); // Posição: Coluna: 0 | Linha: 2
        #endregion

        #region Buttons
        var stackLayoutFooterButtons = BuildStackLayout(string.Empty, null, StackOrientation.Horizontal, LayoutOptions.End, null);
        stackLayoutFooterButtons.Children.Add(GeneratePrimaryButton("RESULTADOS", scheduleViewModel.VisibleResultCommand, rawDataCount++, scheduleViewModel.SelectedSampleBase.Finished));
        stackLayoutFooterButtons.Children.Add(GeneratePrimaryButton("CALCULAR", scheduleViewModel.CalculateRawDataCommand, rawDataCount++, !scheduleViewModel.SelectedSampleBase.Synced));
        stackLayoutFooterButtons.Children.Add(GeneratePrimaryButton("SALVAR", scheduleViewModel.SaveRawDataCommand, rawDataCount++, !scheduleViewModel.SelectedSampleBase.Synced));

        grid.Children.Add(stackLayoutFooterButtons, 0, 3); // Posição: Coluna: 0 | Linha: 3
        #endregion

        Content = grid;

        SetFocusOnFirstEntry();
    }

    private Entry GenerateEntry(RawData rawData, int tabIndex, bool firstElement = false, bool hasNextTabIndex = false)
    {
        var entry = new Entry();
        entry.TabIndex = tabIndex;

        entry.Text = rawData.DisplayValue;
        entry.SetBinding(Entry.TextProperty, nameof(rawData.DisplayValue), BindingMode.TwoWay);

        entry.StyleId = $"RawDataDynamicEntry_{tabIndex}";
        entry.IsTabStop = true;
        entry.IsEnabled = rawData.NotSynced;

        if (rawData.InfoTypeId == (int)InfoType.Integer)
            entry.Behaviors.Add(new NumericValidationBehavior());

        if (firstElement)
            entry.Focus();

        // Temp
        var focusOnReturnBehavior = new FocusOnReturnBehavior();
        focusOnReturnBehavior.HasNextTabIndex = hasNextTabIndex;
        entry.Behaviors.Add(focusOnReturnBehavior);

        return entry;
    }

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Меня немного смущает вопрос. Но я считаю, что у вас есть проблемы с добавлением записей в просмотр списка. Данные вашей наблюдаемой коллекции не заполняются в Listview.

Я написал пост о создании списка с множественным выбором. Вы просто видите, как я создаю список и привязываю к нему содержимое наблюдаемой коллекции.

Пожалуйста, смотрите здесь: https://androidwithashray.blogspot.com/2018/03/multiselect-list-view-using-xamarin.html

Обратите внимание, что для просмотра списка вам не нужен скролл-просмотр, так как просмотр списка автоматически прокручивается, если содержимое больше умещается внутри экрана.

Надеюсь, это поможет !!

0 голосов
/ 18 марта 2019

Для решения моей проблемы я использую:

Code-Behind

    #region Events Changed
    private void EntryTextChanged(object sender, TextChangedEventArgs e)
    {
        var entryChanged = (Entry)sender;
        selectedRawData.DisplayValue = entryChanged.Text;
    }
    private void PickerSelectedIndexChanged(object sender, System.EventArgs e)
    {
        var pickerChanged = (Picker)sender;
        selectedRawData.DisplayValue = selectedItem.Identification;
    }
    #endregion
...