wpf grid itemspresenter

wpf - Usar una cuadrícula como elemento de información



grid itemspresenter (2)

Como está utilizando ItemsControl , se genera un contenedor para cada artículo. Ese contenedor (una instancia de ContentPresenter para un viejo ItemsControl ) envuelve el TextBlock , y es un hijo directo de la Grid . Por lo tanto, la Grid nunca ve las propiedades Column y Row en el TextBlock porque está mirando en su lugar al contenedor.

Puede resolver esto estableciendo un ItemContainerStyle que enlaza las propiedades apropiadas para el contenedor:

<ItemsControl.ItemContainerStyle> <Style TargetType="ContentPresenter"> <Setter Property="Grid.Column" Value="{Binding Column}"/> <Setter Property="Grid.Row" Value="{Binding Row}"/> </Style> </ItemsControl.ItemContainerStyle>

Me gustaría utilizar una cuadrícula como elemento de artículos, pero ninguno de ellos aparece en sus posiciones vinculadas (columna, fila). ¿Cómo puedo hacer que esto funcione? Como un simple ejemplo:

XAML

<ItemsControl ItemsSource="{Binding DataSet}"> <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock Grid.Column="{Binding Col}" Grid.Row="{Binding Row}" Text="{Binding Text}" /> </DataTemplate> </ItemsControl.ItemTemplate> <ItemsControl.Style> <Style TargetType="{x:Type ItemsControl}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ItemsControl}"> <Grid HorizontalAlignment="Stretch" IsItemsHost="True"> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </ItemsControl.Style> </ItemsControl>

Código detrás

Class Window1 Private myTestData As TestData Public Sub New() '' This call is required by the Windows Form Designer. InitializeComponent() '' Add any initialization after the InitializeComponent() call. myTestData = New TestData() Me.DataContext = myTestData End Sub End Class Class TestData Private myDataSet As List(Of DataPoint) Public Property DataSet() As List(Of DataPoint) Get Return myDataSet End Get Set(ByVal value As List(Of DataPoint)) myDataSet = value End Set End Property Public Sub New() Me.DataSet = New List(Of DataPoint) For x As Integer = 0 To 1 For y As Integer = 0 To 1 Me.DataSet.Add(New DataPoint(x, y, "Column " + x.ToString + ", Row " + y.ToString)) Next Next End Sub End Class Class DataPoint Private myRow As Integer Public Property Row() As Integer Get Return myRow End Get Set(ByVal value As Integer) myRow = value End Set End Property Private myCol As Integer Public Property Col() As Integer Get Return myCol End Get Set(ByVal value As Integer) myCol = value End Set End Property Private myText As String Public Property Text() As String Get Return myText End Get Set(ByVal value As String) myText = value End Set End Property Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal name As String) Me.Row = y Me.Col = x Me.Text = name End Sub End Class


Posible solución: si usa UniformGrid , es posible que no necesite especificar las filas y columnas.