使用Grid作为ItemsHost

时间:2009-03-27 20:40:22

标签: wpf grid itemspresenter

我想使用Grid作为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>

代码隐藏

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

2 个答案:

答案 0 :(得分:3)

因为您使用的是ItemsControl,所以会为每个项目生成一个容器。该容器(普通旧ContentPresenter的{​​{1}}实例)包裹ItemsControl,并且是TextBlock的直接子项。因此,Grid甚至从未看到Grid上的ColumnRow属性,因为它正在查看容器。

您可以通过设置绑定容器的相应属性的TextBlock来解决此问题:

ItemContainerStyle

答案 1 :(得分:1)

可能的解决方法:如果您使用UniformGrid,则可能不需要指定行和列。