最近在用silverlight4做个小项目,遇到些问题.
前台界面有一个DataGrid控件.
大伙应该都知道,DataGrid绑定是不能用匿名类的,所以我那里会是用的泛型结构体.别烦我啰索,也许就有很多人都忘了,这个泛型结构体有时候还是比较好用的,就当是复习了.
泛型结构如下:
public struct CP<T, K>
{
public T Field1
{ get; set; }
public K Field2
{ get; set; }
}
界面代码:
<sdk:DataGrid Name="dgStock" IsReadOnly="True" AutoGenerateColumns="False" HorizontalContentAlignment="Center" GridLinesVisibility="All">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="货物名称" MinWidth="50" Binding="{Binding Field2}"></sdk:DataGridTextColumn>
<sdk:DataGridTextColumn Header="单位名称" MinWidth="50" Binding="{Binding Field4}"></sdk:DataGridTextColumn>
<sdk:DataGridTextColumn Header="规格" MinWidth="50" Binding="{Binding Field5}"></sdk:DataGridTextColumn>
<sdk:DataGridTextColumn Header="数量" MinWidth="50" Binding="{Binding Field3}"></sdk:DataGridTextColumn>
<sdk:DataGridTextColumn Header="入库时间" MinWidth="50" Binding="{Binding Field6,StringFormat=yyyy-MM-dd}"></sdk:DataGridTextColumn>
<sdk:DataGridTextColumn Header="大仓库" MinWidth="50" Binding="{Binding Field7}"></sdk:DataGridTextColumn>
<sdk:DataGridTextColumn Header="存放仓库" MinWidth="50" Binding="{Binding Field7}"></sdk:DataGridTextColumn>
<sdk:DataGridTextColumn Header="存放仓位" MinWidth="50" Binding="{Binding Field8}"></sdk:DataGridTextColumn>
<sdk:DataGridTemplateColumn Header="操作" MinWidth="50">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<sdk:Label Content="数量:" Margin="5 0 0 0"></sdk:Label>
<TextBox Name="txtCount" Width="50" Height="22"></TextBox>
<ComboBox Name="ddlBigdepot" Width="80" Height="22" ItemsSource="{Binding Field9}" SelectionChanged="ddlBigdepot_SelectionChanged">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Width="85" Text="{Binding Field2}" Tag="{Binding Field1}"></TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ComboBox Name="ddlStorage" Width="85" Height="22" SelectionChanged="ddlStorage_SelectionChanged"></ComboBox>
<ComboBox Name="ddlFreightSpace" Width="85" Height="22"></ComboBox>
</StackPanel>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
因为这个DataGrid不需要分页,所以后台代码中,获取到数据源以后就直接绑定了.数据源就是一个List集合;
绑定数据源也就一句代码:
this.dgStock.ItemsSource = e.Result;
结果运行起来数据也能正常显示.但是后面就遇到问题了.我要取到列表中每一行的第九列中的控件和值.
取值代码如下:
foreach (object obj in this.dgStock.ItemsSource)
{
FrameworkElement frameElement = dgStock.Columns[8].GetCellContent(obj);
if (frameElement != null)
{
//取值代码;
}
}
但是调试了好几遍,那个frameElement就是一直为null,一直取不到值,纳闷了很多,也试了很多次.还是不知道为什么...网上查也没查到过这样的问题.
翻开以前写的其他页面的代码,可是其他列表中又可以获取到值啊,界面是一样的绑定方式,后台取值的代码也是一样.觉得很奇怪,后来注意到之前的列表都是带分页的,绑定的时候就用到了一个类:PagedCollectionView
查了下msdn,很简单的说明了一下:表示用于分组、排序、筛选和导航分页数据集合的视图.后面的备注写的稍清楚点:
使用 PagedCollectionView 可为实现 IEnumerable 接口的任何集合提供分组、排序、筛选和分页功能。 DataPager 控件提供一个方便的用户界面,用于使用PagedCollectionView 控制分页。
可以将集合视图视为位于绑定源集合之上的一个层,您可以通过它使用排序、筛选和分组查询来导航和显示集合,所有这些操作都无需操作基础源集合本身。
看到有这个类了后,就试了一下.在用代码给列表作数据源绑定时,用上这个类.其实也就是多了一句代码,只是这样意义就完全不同了PagedCollectionView transferSource = new PagedCollectionView(e.Result);
this.dgStock.ItemsSource = transferSource;
这样绑定了后再一试,OK,能够找到相应的控件了...
不过现在也只是知其然而不知其所以然... 还是没明白为什么.只是知道如果要对列表的行进行枚举,就必须要将数据源经过这个类的转换,再绑定才可以...
好了..
继续求学中.......