silverlight datagrid列表枚举找控件


  最近在用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,能够找到相应的控件了...
不过现在也只是知其然而不知其所以然... 还是没明白为什么.只是知道如果要对列表的行进行枚举,就必须要将数据源经过这个类的转换,再绑定才可以...
好了.. 继续求学中.......



©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页