(Xamarin) Привязать данные из нескольких классов к одному ListView? - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь создать ListView, который рисует данные из двух таблиц SQLite. Одна - это таблица заголовков, а другая - таблица сведений. Таблица заголовка имеет поле Id, которое действует как первичный ключ, и имеет отношение один ко многим с таблицей сведений (это поле Id является единственным столбцом, который разделяют обе таблицы).

Теоретически мой ListView будет иметь Id таблицы заголовков, отображаемый внутри ViewCell, а при касании он развернется и отобразит все строки таблицы Detail с одинаковым Id. Проблема в том, что я не знаю, как настроить ListSource для ListView, чтобы он рисовал из обеих таблиц, и, очевидно, SQLite не принимает List<Table> в качестве допустимого свойства. Что касается действия развертывания / свертывания, я думаю, что установка ViewRell для высоты в обработчике событий, к которому относится нажатие, - это метод, который я попробую, но, пожалуйста, не стесняйтесь поделиться какими-либо приемами или фрагментами кода, которые вы, возможно, использовали для этого ранее.

Редактировать: @ iSpain17 вот мой код в соответствии с последним фрагментом ответа iSpain17. Ошибка, которую дает мне редактор XAML: «Свойство ElementTemplateContent установлено более одного раза».

<CollectionView ItemsSource="{Binding HeaderDetailsList}">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <TextCell Text="{Binding HeaderId}"/>
                            <CollectionView>
                                <CollectionView.ItemTemplate>
                                    <DataTemplate>
                                        <TextCell Text="{Binding DetailsPart1}"/>
                                    </DataTemplate>
                                </CollectionView.ItemTemplate>
                            </CollectionView>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>

1 Ответ

0 голосов
/ 11 октября 2019

Вы не ввели свой собственный код, поэтому я могу только догадываться:

Вы создаете класс, например, HeaderDetails (очевидно, просто черновик):

class HeaderDetails : BindableObject {

    public List<Detail> DetailsForThisId { get; set; }
    public int Id { get; set; }

    public HeaderDetails(int headerId) {
       Id = headerId;
       DetailsForThisId = GetDetailItemsForId(headerId); //This method queries your SQLite details table based on given Id.
    }

}

Тогда ваш основнойViewModel для страницы имеет List<HeaderDetails>:

public class ViewModel : INotifyPropertyChanged {
    [...]
    private ObservableCollection headerDetailsList { get; set; }
    public ObservableCollection<HeaderDetails> HeaderDetailList {
        get => headerDetailsList;
        set {
            headerDetailsList = value;
            OnPropertyChanged();
        }
    }
    [...]

    public ViewModel() {
        [...]
        var _headerDetailList = new List<HeaderDetails>();
        var headerIds = QueryAllHeaderIds() //Should return a list of all header Ids in your SQLite header table.

        foreach(var headerId in headerIds) {
             _headerDetailsList.Add(new HeaderDetails(headerId));
        }

        HeaderDetailList = new ObservableCollection(_headerDetailList);
    }
}

Затем в вашем файле XAML (пожалуйста, используйте CollectionView)

<CollectionView ItemSource="{Binding HeaderDetailsList}" [...]>
  [...]
  <CollectionView.ItemTemplate>
    <DataTemplate>
      <!-- Your inner View (StackLayout, etc.) --> 
      [...]
      <CollectionView ItemSource="{Binding DetailsForThisId}" [...]>
        [...]
      </CollectionView>
      [...]
    </DataTemplate>
  </CollectionView.ItemTemplate>
</CollectionView>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...