2009-03-27 4 views
2

Ich möchte ein Raster als ItemsHost verwenden, aber keines der Elemente erscheint in ihren gebundenen (Spalte, Zeile) Positionen. Wie kann ich das schaffen? Als ein einfaches Beispiel:Verwenden eines Gitters als ItemsHost

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> 

Codebehind

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 

Antwort

3

Da Sie ein ItemsControl verwenden, wird ein Behälter für jedes Element erzeugt. Dieser Container (eine Instanz von ContentPresenter für eine einfache alte ItemsControl) umschließt die TextBlock und ist ein direktes Kind der Grid. Daher sieht die Grid nie die Column und Eigenschaften auf der TextBlock, weil es stattdessen auf den Container schaut.

Sie können dieses Problem lösen, indem sie ein ItemContainerStyle Einstellung, die die entsprechenden Eigenschaften für den Behälter bindet:

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

Du bist gerade mein Held geworden. –

1

Mögliche Abhilfe: Wenn Sie UniformGrid verwenden, können Sie nicht die Zeilen und Spalten angeben.