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;
}