Estoy tratando de crear un ListView que extraiga datos de dos tablas SQLite. Una es una tabla de encabezado y la otra es una tabla de detalles. La tabla de encabezado tiene un campo Id que actúa como clave principal y tiene una relación de uno a muchos con la tabla de detalles (este campo Id es la única columna que comparten ambas tablas).

Mi ListView en teoría tendría el ID de la tabla de encabezado mostrado dentro de una ViewCell, y cuando se toca, se expandiría y mostraría todas las filas de la tabla de detalles con el mismo ID. El problema es que no sé cómo configurar ItemsSource de Listview para que se extraiga de ambas tablas y, obviamente, SQLite no acepta List<Table> como una propiedad válida. En lo que respecta a la acción de expandir / contraer, creo que configurar el HeightRequest de ViewCell en el controlador de eventos pulsado es el método que probaré, pero no dude en compartir cualquier técnica o fragmento de código que pueda haber utilizado para hacer esto anteriormente.

Editar: @ iSpain17 aquí está mi código según el último fragmento de la respuesta de iSpain17. El error que me da el editor XAML es "La propiedad 'ElementTemplateContent' está configurada más de una vez".

<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>
0
Nick 30 sep. 2019 a las 10:44

1 respuesta

La mejor respuesta

No proporcionaste exactamente tu propio código, así que solo puedo adivinar:

Creas una clase, p. Ej. HeaderDetails (obviamente solo un borrador):

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

}

Entonces su ViewModel principal para la página tiene un 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);
    }
}

Luego, en su archivo XAML (use CollectionView)

<CollectionView ItemSource="{Binding HeaderDetailsList}" [...]>
  [...]
  <CollectionView.ItemTemplate>
    <DataTemplate>
      <!-- Your inner View (StackLayout, etc.) --> 
      [...]
      <CollectionView ItemSource="{Binding DetailsForThisId}" [...]>
        [...]
      </CollectionView>
      [...]
    </DataTemplate>
  </CollectionView.ItemTemplate>
</CollectionView>
0
iSpain17 14 oct. 2019 a las 07:24