我应该如何将列表数据添加到网格

How should I add list data to Grid

<Grid Grid.Row="1">
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    
</Grid>

我想从这里的列表中添加 TextBlock

ViewModel 代码

我尝试使用 ListBox,但这不是我想要的。

<ListBox ItemsSource="{Binding Serials}" Grid.Row="1">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal" IsItemsHost="True" ScrollViewer.CanContentScroll="True"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <TextBlock Text="{Binding aaa}" Margin="20"/>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我将框住网格并进行分页。 我想要的是将 TextBlock 在网格中居中。

我应该怎么做?

XAML代码

<Grid Grid.Row="1" x:Name="gridMain">
    <Grid.ColumnDefinitions>
...
</Grid>

代码隐藏

TextBlock textBlock = new TextBlock();
textBlock.Text = "I'm here!";

Grid.SetRow(textBlock, 2);
Grid.SetColumn(textBlock, 2);
gridMain.Children.Add(textBlock);

这里的方法是错误的,您可以简单地使用 ListView 而不是网格,它会动态使用 space 并在网格视图中显示。

我们填充我们自己的用户对象列表,每个用户都有姓名和年龄。一旦我们将列表分配给 ListView 的 ItemsSource 属性,数据绑定过程就会自动发生,但结果有点令人沮丧:

示例代码如下:

Xaml :

<Grid>
  <ListView Margin="10" Name="lvDataBinding"></ListView>
</Grid>

c#

public partial class ListViewDataBindingSample : Window
 {
    public ListViewDataBindingSample()
    {
        InitializeComponent();
        List<User> items = new List<User>();
        items.Add(new User() { Name = "John Doe", Age = 42 });
        items.Add(new User() { Name = "Jane Doe", Age = 39 });
        items.Add(new User() { Name = "Sammy Doe", Age = 13 });
        lvDataBinding.ItemsSource = items;
    }
 }

public class User
{
    public string Name { get; set; }

    public int Age { get; set; }
}

我想你在 GridListview 之间感到困惑。

为什么要同时使用两者?

试试水平列表视图。

<ListView.ItemsPanel>
    <ItemsPanelTemplate>
        <StackPanel Orientation="Horizontal"></StackPanel>
    </ItemsPanelTemplate>
</ListView.ItemsPanel>

如果您想使用 Grid 布局绑定列表,请使用 ListBoxUniformGrid as items panel. Specify a property in DisplayMemberPath, then you do not have to create a redundant DataTemplate to bind aaa. Assign an ItemsContainerStyle 调整内容对齐方式以将内容居中。

<ListBox Grid.Row="1" ItemsSource="{Binding Serials}" DisplayMemberPath="aaa">
   <ListBox.ItemsPanel>
      <ItemsPanelTemplate>
         <UniformGrid Rows="6" Columns="8"/>
      </ItemsPanelTemplate>
   </ListBox.ItemsPanel>
   <ListBox.ItemContainerStyle>
      <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
         <Setter Property="HorizontalContentAlignment" Value="Center"/>
         <Setter Property="VerticalContentAlignment" Value="Center"/>
      </Style>
   </ListBox.ItemContainerStyle>
</ListBox>

您当然可以绑定 UniformGridRowsColumns,以动态调整网格。