我应该如何将列表数据添加到网格
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; }
}
我想你在 Grid
和 Listview
之间感到困惑。
为什么要同时使用两者?
试试水平列表视图。
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
如果您想使用 Grid
布局绑定列表,请使用 ListBox
和 UniformGrid
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>
您当然可以绑定 UniformGrid
的 Rows
和 Columns
,以动态调整网格。
<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; }
}
我想你在 Grid
和 Listview
之间感到困惑。
为什么要同时使用两者?
试试水平列表视图。
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
如果您想使用 Grid
布局绑定列表,请使用 ListBox
和 UniformGrid
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>
您当然可以绑定 UniformGrid
的 Rows
和 Columns
,以动态调整网格。