在做WPF项目的时候呢,我们会遇到一个问题,就是数据库里面有多少条数据呢,那我们就动态生成数据把它给显示出来,以我做的帝友借贷系统为例:我获取到了所有借款人的信息后,我要把这些数据显示在投资的界面上给想投资的人看,那么我要怎样子办呢?我不能一个一个在页面写出来吧,况且我也不知道到底有多少条数据呀,那么要解决这一类问题就需要用到动态生成数据了,这里呢,我用的是WPF的ListBox去生成,把模板放在资源(style)上,然后在重写ListBox上引用资源(style).下面请看代码:
首先,你得把你设计好的样式布局放在静态资源上,值得注意的是Binding 绑定的值(它是来源于数据库的表头字段)
<Style x:Key="UserInfoStyle" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Grid Margin="0,10,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.2*"/>
<ColumnDefinition Width="10*"/>
<ColumnDefinition Width="0.2*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0.3*"/>
<RowDefinition Height="10*"/>
<RowDefinition Height="0.3*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="1" Grid.Column="1">
<DockPanel VerticalAlignment="Top" Margin="0,0,5,0">
<Border DockPanel.Dock="Top" BorderBrush="#dbdbdb" BorderThickness="1" Height="100" Margin="0,0,0,10" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid Grid.Row="0" Grid.Column="0">
<TextBlock Text="{Binding clientName}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="15" Foreground="#515151"/>
<TextBlock x:Name="UserID" Text=""/>
</Grid>
<WrapPanel Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="借款总额:" FontSize="13"/>
<TextBlock Text="{Binding callForBidMoney}" VerticalAlignment="Center" Foreground="Orange"/>
<TextBlock Text="元" VerticalAlignment="Center" Foreground="Orange"/>
</WrapPanel>
<WrapPanel Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="最低投标金额:" FontSize="13"/>
<TextBlock Text="{Binding minBidMoney}" VerticalAlignment="Center" />
<TextBlock Text="元" VerticalAlignment="Center" />
</WrapPanel>
<WrapPanel Grid.Row="1" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="年化利率:" FontSize="13"/>
<TextBlock Text="{Binding apr}" VerticalAlignment="Center" />
<TextBlock Text="%" FontSize="13"/>
</WrapPanel>
<WrapPanel Grid.Row="2" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="还剩:" FontSize="13"/>
<TextBlock Text="{Binding residueCopies}" VerticalAlignment="Center" />
<TextBlock Text="份" VerticalAlignment="Center" />
</WrapPanel>
<WrapPanel Grid.Row="1" Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="借款期限:" FontSize="13"/>
<TextBlock Text="{Binding BorrowdeadlineTime}" VerticalAlignment="Center" />
</WrapPanel>
<WrapPanel Grid.Row="2" Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="借款进度:" FontSize="13"/>
<TextBlock x:Name="borrowProsess" Text="{Binding strBorrowMoney}" VerticalAlignment="Center" />
<TextBlock Text="%" VerticalAlignment="Center"/>
</WrapPanel>
<Button Grid.Row="1" Grid.Column="3">关注</Button>
<Button x:Name="btnHomePages" Grid.Row="2" Grid.Column="3" Click="Btn_Subscribe" Tag="" >立即认购</Button>
</Grid>
</Border>
</DockPanel>
<!--<ScrollViewer>
</ScrollViewer>-->
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
然后,就是在你正常的布局里面用ListBox布局,并且引用style里的样式
<ListBox Grid.Row="1" x:Name="UserInfoList" ItemContainerStyle="{StaticResource UserInfoStyle}" BorderBrush="#eaeaeb" BorderThickness="1">
<ListBox.Style>
<Style TargetType="ListBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
<ScrollViewer>
<ItemsPresenter />
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.Style>
</ListBox>
WPF后台代码:
/// <summary>
/// 页面加载时
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
GetData();
}
public void GetData()
{
int UserId = StaticType.UserId;
List<CallingForBidSsucceed> list = new List<CallingForBidSsucceed>();
DataTable dt = MyProcessClient.Loaded_SelectCallingForBidSsucceed(UserId).Tables[0];
for (int i = 0; i < dt.Rows.Count; i++)
{
CallingForBidSsucceed callingFor = new CallingForBidSsucceed()
{
clientName = Convert.ToString(dt.Rows[i]["clientName"]),
callForBidMoney = Convert.ToDecimal(dt.Rows[i]["callForBidMoney"]),
apr = Convert.ToString(dt.Rows[i]["apr"]),
deadlineTime = Convert.ToInt32(dt.Rows[i]["deadlineTime"]),
minBidMoney = Convert.ToDecimal(dt.Rows[i]["minBidMoney"]),
residueCopies = Convert.ToInt32(dt.Rows[i]["residueCopies"]),
userID = Convert.ToInt32(dt.Rows[i]["userID"]),
repaymentWay = Convert.ToString(dt.Rows[i]["repaymentWay"]),
loansNumber=Convert.ToString(dt.Rows[i]["loansNumber"]),
BorrowdeadlineTime=Convert.ToString(dt.Rows[i]["borrowTime"]),
callingForBidsId=Convert.ToInt32(dt.Rows[i]["callingForBidsId"]),
strBorrowMoney = decimal.Round((Convert.ToDecimal(dt.Rows[i]["strBorrowMoney"]) / Convert.ToDecimal(dt.Rows[i]["callForBidMoney"])) * 100,2)
};
list.Add(callingFor);
}
UserInfoList.ItemsSource = list;
}
最后的效果图:
这里是截图的一部分,这里有四条数据