Pregunta

Tengo una cuadrícula con solo 1 fila. Me gustaría que la cantidad de columnas sea determinada por el contexto de datos de la cuadrícula.

Por ejemplo, si tengo una lista de nombres expuestos en una propiedad ObservableCollection llamada 'Nombres' que devuelven '' Fred '', '' Joe '' y '' Anne '', me gustaría tres columnas en la cuadrícula, cada una con un cuadro de texto vinculado a cada nombre.

Mis pensamientos hasta ahora:

1) Construya la cuadrícula a mano en el código subyacente y reconstruya cuando cambie ObservableCollection. No seguí con esto, ya que parecía un poco confuso y no la forma en que WPF hacía las cosas.

2) Cree un enlace con la propiedad ColumnDefinitions de la cuadrícula. Esto parecía más correcto, pero no hay una propiedad de dependencia en la cuadrícula para ColumnDefinition.

¿Fue útil?

Solución

No creo que modificar una Grilla sobre la marcha sea tu mejor opción. Aquí hay otra solución. Puede usar ListBox, pero reemplace el ItemsPanel con otro panel de su elección. ItemsPanel predeterminado de ListBox es VirtualizingStackPanel con Orientación establecida en Vertical. Como desea que sus elementos se muestren horizontalmente, puede reemplazarlos con VirtualizingStackPanel con Orientación establecida en Horizontal . Por supuesto, puede modificar ItemsTemplate o cualquier otra cosa que considere conveniente.

<ListBox ItemsSource="{Binding MyCollection}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

También he usado este método antes para crear un ListBox que muestra los elementos horizontalmente, pero pasa a la siguiente línea cuando se queda sin espacio en la línea, utilizando un WrapPanel. También puede crear sus propios paneles personalizados y sustituirlos. Una vez hice un panel que presentaba sus elementos al azar, y lo usé para un ListBox. Cada elemento de mi colección encuadernada se mostró en una posición aleatoria dentro del ListBox. Cada vez que se actualiza el diseño, los elementos tienen una nueva posición.

Otros consejos

Si es un DataGrid , el AutoGenerateColumns haría esto. Mediante el uso de DataGridTemplateColumn , puede poner controles de cuadro de texto en lugar de solo texto allí. Deberá proporcionar un evento adjunto a AutoGeneratingColumn y en el AutoGeneratingColumnEventArgs (hola, Microsoft, esta es la llamada del túnel carpel), establece la propiedad Column en una columna de plantilla con el cuadro de texto.

Diría que su forma de ObservableCollection es más simple ;-P.

Si puede aceptar tener los nombres en cada fila en lugar de en cada columna, debe usar ListView con una propiedad GridView View y una CellTemplate personalizada que es solo un cuadro de texto enlazado. Algo como esto:

<ListView ItemsSource="{Binding Names}">
  <ListView.View>
    <GridView>
      <GridViewColumn>
        <GridViewColumn.CellTemplate>
          <!-- Your textbox goes in a DataTemplate here -->             
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
    </GridView>
  </ListView.View>
</ListView>

Desafortunadamente, la solución # 2 no es posible en XAML. La solución n. ° 1 es su mejor opción si debe tener cada nombre en su propia columna.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top