代码之家  ›  专栏  ›  技术社区  ›  Bryan Anderson

将网格用作项目列表

  •  2
  • Bryan Anderson  · 技术社区  · 17 年前

    我想使用网格作为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 回复  |  直到 17 年前
        1
  •  4
  •   Tim Cooper    14 年前

    因为你用的是 ItemsControl ,将为每个项目生成一个容器。该容器(的实例) ContentPresenter 对于一个普通的老人 项目控制 TextBlock ,并且是 Grid . 因此, 网格 Column Row 上的属性 因为它在看容器。

    您可以通过设置 ItemContainerStyle

    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Grid.Column" Value="{Binding Column}"/>
            <Setter Property="Grid.Row" Value="{Binding Row}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    
        2
  •  1
  •   Daniel Earwicker    17 年前

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