Silverlight实用窍门系列:73.Silverlight的DataGrid分组以及模拟合并单元格

一、DataGrid分组

  在Silverlight的表格中可能需要对某一些数据进行分组以方便客户查看,我们使用PagedCollectionView集合作为数据源,然后通过设置其GroupDescriptions属性值,添加需要分组的实体集合属性,注意:如果需要两层分组则添加两个属性即可。

  Xaml代码

        <sdk:DataGrid HorizontalAlignment="Left"  AutoGenerateColumns="False"   Name="ShowCityList" 
                      VerticalAlignment="Top"  Height="400"  >
            <sdk:DataGrid.Columns>
                <sdk:DataGridTextColumn Header="省会" Binding="{Binding AddrName}"  Width="108"/>
                <sdk:DataGridTextColumn Header="城市" Binding="{Binding CityName}" IsReadOnly="True" Width="108"/>
                <sdk:DataGridTextColumn Header="电话区号" Binding="{Binding TelNum}" IsReadOnly="True" Width="108"/>
            </sdk:DataGrid.Columns>
        </sdk:DataGrid>

  Xaml.cs代码如下:

            PagedCollectionView view = new PagedCollectionView(CityInfo.GetInfo());
            //此处根据AddrName属性分组
            view.GroupDescriptions.Add(new PropertyGroupDescription("AddrName"));
            //如果需要多重分组,则取消以下注释
            //view.GroupDescriptions.Add(new PropertyGroupDescription("CityName"));
            this.ShowCityList.ItemsSource = view;

  实体数据源函数如下:

        public static List<CityInfo> GetInfo()
        {
            var list = new List<CityInfo>();
            list.Add(new CityInfo() { AddrName = "北京",CityName = "北京市",TelNum = "010" });
            list.Add(new CityInfo() { AddrName = "上海",CityName = "上海市",TelNum = "020" });
            list.Add(new CityInfo() { AddrName = "广东",CityName = "广州市",TelNum = "021" });
            list.Add(new CityInfo() { AddrName = "广东",CityName = "深圳市",TelNum = "0210" });
            list.Add(new CityInfo() { AddrName = "四川",CityName = "成都市",TelNum = "028" });
            list.Add(new CityInfo() { AddrName = "四川",CityName = "内江市",TelNum = "0832" });
            list.Add(new CityInfo() { AddrName = "四川",CityName = "自贡市",TelNum = "0831" });
            return list;
        }

  效果如下:

二、模拟合并单元格

  在本实例中我们通过对数据源进行构造,然后在DataGrid控件上设置DataGridTemplateColumn的模板方式模拟合并单元格。

  Xaml代码

        <sdk:DataGrid HorizontalAlignment="Left"  AutoGenerateColumns="False"   Name="ShowCity"
                      VerticalAlignment="Top"  Height="400"  Margin="400 0 0 0" >
            <sdk:DataGrid.Columns>
                <sdk:DataGridTextColumn Header="省会" Binding="{Binding AddrName}" IsReadOnly="True" Width="108"/>
                <sdk:DataGridTemplateColumn Header="城市" Width="108">
                    <sdk:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ItemsControl ItemsSource="{Binding CityNames}"/>
                        </DataTemplate>
                    </sdk:DataGridTemplateColumn.CellTemplate>
                </sdk:DataGridTemplateColumn>
                <sdk:DataGridTemplateColumn Header="电话区号" Width="108">
                    <sdk:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ItemsControl ItemsSource="{Binding TelNums}" />
                        </DataTemplate>
                    </sdk:DataGridTemplateColumn.CellTemplate>
                </sdk:DataGridTemplateColumn>
            </sdk:DataGrid.Columns>
        </sdk:DataGrid>

  Xaml.cs代码

this.ShowCity.ItemsSource = CityInfo.GetInfoList();

  实体数据源函数如下:

        public static List<CityInfo> GetInfoList()
        {
            var list = new List<CityInfo>();
            list.Add(new CityInfo() { AddrName = "北京",CityNames = new List<string>() { "北京市" },TelNums = new List<string>() { "010" } });
            list.Add(new CityInfo() { AddrName = "上海",CityNames = new List<string>() { "上海市" },TelNums = new List<string>() { "020" } });
            list.Add(new CityInfo() { AddrName = "广东",CityNames = new List<string>() { "广州市","深圳市" },TelNums = new List<string>() {  "021","0210" } });
            list.Add(new CityInfo() { AddrName = "四川",CityNames = new List<string>() { "成都市","内江市","自贡市" },TelNums = new List<string>() { "028","0832","0831" } });
            return list;
        }

  效果如下:

三、实体类如下:

    /// <summary>
    /// 城市信息的实体类
    /// </summary>
    public class CityInfo
    {
        private string _AddrName;
        private string _CityName;
        private string _TelNum;

        public string AddrName
        {
            get { return _AddrName; }
            set { _AddrName = value; }
        }
        public string CityName
        {
            get { return _CityName; }
            set { _CityName = value; }
        }

        public string TelNum
        {
            get { return _TelNum; }
            set { _TelNum = value; }
        }


        private List<string> _CityNames;
        public List<string> CityNames
        {
            get { return _CityNames; }
            set { _CityNames = value; }
        }

        private List<string> _TelNums;

        public List<string> TelNums
        {
            get { return _TelNums; }
            set { _TelNums = value; }
        }
}

  本实例需要引用System.Windows.Data.dll程序集,如需源码请点击 SLDataGrid.rar 下载 

相关文章

如何在Silverlight4(XAML)中绑定IsEnabled属性?我试过简单的...
我正在编写我的第一个vb.net应用程序(但我也会在这里标记c#,...
ProcessFile()是在UIThread上运行还是在单独的线程上运行.如...
我从同行那里听说,对sharepoint的了解对职业生涯有益.我们不...
我正在尝试保存一个类我的类对象的集合.我收到一个错误说明:...
我需要根据Silverlight中的某些配置值设置给定控件的Style.我...