Siverlight 动态生成datagrid复杂表头

来源:互联网 发布:西安网络电视台 编辑:程序博客网 时间:2024/05/17 01:26

既然可以动态生成复杂表头,自然也就可以动态绑定,也就不需要建立两个datagrid同步滚动了


先建立两个模板文件(就是简单的siverlight页)

表头模板

<Style  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:p="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data" TargetType="p:DataGridColumnHeader">
    <Setter Property="FontWeight" Value="Bold"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>


                    <!--/////////////111111///////////////-->


                    <Rectangle x:Name="BackgroundRectangle" Fill="#FF1F3B53" Stretch="Fill" Grid.ColumnSpan="2"/>
                    <Rectangle x:Name="BackgroundGradient" Stretch="Fill" Grid.ColumnSpan="2">
                        <Rectangle.Fill>
                            <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
                                <GradientStop Color="#FCFFFFFF" Offset="0.015"/>
                                <GradientStop Color="#F7FFFFFF" Offset="0.375"/>
                                <GradientStop Color="#E5FFFFFF" Offset="0.6"/>
                                <GradientStop Color="#D1FFFFFF" Offset="1"/>
                            </LinearGradientBrush>
                        </Rectangle.Fill>
                    </Rectangle>


                    <!--上面两个Rectangel是Datagrid动态列的背景颜色,可以删除,个人喜好-->


                    <Grid HorizontalAlignment="Stretch">


                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal"/>
                                <VisualState x:Name="MouseOver">
                                    <Storyboard>
                                        <ColorAnimation Duration="0" 
                                                    Storyboard.TargetName="BackgroundRectangle" 
                                                    Storyboard.TargetProperty="(Fill).Color" To="#FF448DCA"/>
                                        <ColorAnimation Duration="0" 
                                                    Storyboard.TargetName="BackgroundGradient" 
                                                    Storyboard.TargetProperty="(Fill).(GradientStops)[3].Color" To="#7FFFFFFF"/>
                                        <ColorAnimation Duration="0" 
                                                    Storyboard.TargetName="BackgroundGradient" 
                                                    Storyboard.TargetProperty="(Fill).(GradientStops)[2].Color" To="#CCFFFFFF"/>
                                        <ColorAnimation Duration="0" 
                                                    Storyboard.TargetName="BackgroundGradient" 
                                                    Storyboard.TargetProperty="(Fill).(GradientStops)[1].Color" To="#F2FFFFFF"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <ColorAnimation Duration="0" 
                                                    Storyboard.TargetName="BackgroundRectangle" 
                                                    Storyboard.TargetProperty="(Fill).Color" To="#FF448DCA"/>
                                        <ColorAnimation Duration="0" 
                                                    Storyboard.TargetName="BackgroundGradient" 
                                                    Storyboard.TargetProperty="(Fill).(GradientStops)[0].Color" To="#D8FFFFFF"/>
                                        <ColorAnimation Duration="0" 
                                                    Storyboard.TargetName="BackgroundGradient" 
                                                    Storyboard.TargetProperty="(Fill).(GradientStops)[1].Color" To="#C6FFFFFF"/>
                                        <ColorAnimation Duration="0" 
                                                    Storyboard.TargetName="BackgroundGradient" 
                                                    Storyboard.TargetProperty="(Fill).(GradientStops)[2].Color" To="#8CFFFFFF"/>
                                        <ColorAnimation Duration="0" 
                                                    Storyboard.TargetName="BackgroundGradient" 
                                                    Storyboard.TargetProperty="(Fill).(GradientStops)[3].Color" To="#3FFFFFFF"/>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="SortStates">
                                <VisualState x:Name="Unsorted"/>
                                <VisualState x:Name="SortAscending" />
                                <VisualState x:Name="SortDescending" />
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        {#replace#} //这里要加上,动态生成的表头要填充到这里
                    </Grid>
                    
                    <!--这个Rectangel是Datagrid拖动列宽度时的那个根线-->
                    <Rectangle x:Name="VerticalSeparator" Fill="#FFC9CACA" 
                                           VerticalAlignment="Stretch" Width="1" Visibility="Visible" 
                                           Grid.Row="1" Grid.Column="1"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

列模板


<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >

       <!--这里是内容部分-->

        {#replace#} //要被动态生成的代码覆盖
    </Grid>
</DataTemplate>



cs代码


//创建一个简单的列

public static DataGridTemplateColumn CreateSingleTemplateColumn(string name, long SmallDigit, string key)
        {
            var column = new DataGridTemplateColumn();


            #region 生成头样式
            var sb = new StringBuilder();
            //增加父头显示
            sb.AppendLine(string.Format("<ContentPresenter Content=\"{0}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>", name));


            //合成模板 填写你的HeaderStyle.xaml所在的路径 /...../HeaderStyle.xaml

            //注意url的格式  UH是项目名称 component固定写法,后边的才是那个模板文件的相对路径
            Uri mm = new Uri("/UH;component/../../MyStyle/HeaderStyle.xaml", UriKind.Relative);


            var res = Application.GetResourceStream(mm);
            var sr = new StreamReader(res.Stream);
            var h_style = sr.ReadToEnd();
            h_style = h_style.Replace("{#replace#}", sb.ToString());//覆盖模板文件中的{#replace#}
            //生成样式
            column.HeaderStyle = (Style)XamlReader.Load(h_style);
            #endregion
            sb.Clear();
            #region 生成CELL模板


            string sds = "#0.";
            if (SmallDigit > 0)
            {
                for (int sd = 0; sd < SmallDigit; sd++)
                {
                    sds += "0";
                }
                sb.AppendLine("<TextBlock Height=\"30\" Text=\"{Binding [" + key + "],StringFormat='" + sds + "'}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />");
            }
            else
            {
                //sb.AppendLine("<TextBlock Height=\"30\" Text=\"{Binding [" + key + "]}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />");
                sb.AppendLine("<TextBlock Height=\"30\" Text=\"{Binding "+key+"}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />");
                
            }
            //合成模板
            res = Application.GetResourceStream(new Uri("/UH;component/../../MyStyle/CellDataTemplate.xaml", UriKind.Relative));
            var sr2 = new StreamReader(res.Stream);
            var cell_Template = sr2.ReadToEnd();
            cell_Template = cell_Template.Replace("{#replace#}", sb.ToString());
            //生成样式
            column.CellTemplate = (DataTemplate)XamlReader.Load(cell_Template);
            #endregion


            return column;
        }

       

        //创建喊有一个父标题的列,parent父标题名称,bindings是子表头可以喊有对个子标题,每个键值对表示一列的列名与绑定的值

       //这里只支持一个父标题
        public static DataGridTemplateColumn CreateComplexTemplateColumn(string parent,IDictionary<string, string> bindings)
        {
            var column = new DataGridTemplateColumn();
            var list = bindings.Keys.ToList();


            #region 生成头样式
            var sb = new StringBuilder();
            sb.AppendLine("<Grid.RowDefinitions>");
            sb.AppendLine("<RowDefinition Height=\"20\" />");
            sb.AppendLine("<RowDefinition Height=\"1\" />");
            sb.AppendLine("<RowDefinition Height=\"20\" />");
            sb.AppendLine("</Grid.RowDefinitions>");
            sb.AppendLine("<Grid.ColumnDefinitions>");
            for (int i = 0; i < list.Count; i++)
            {
                if (i > 0)
                    sb.AppendLine("<ColumnDefinition Width=\"1\" />");
                sb.AppendLine("<ColumnDefinition Width=\"80*\"/>");
            }
            int offsetNum = bindings.Keys.Count * 2 - 1;
            sb.AppendLine("</Grid.ColumnDefinitions>");
            //增加父头显示
            sb.AppendLine(string.Format("<ContentPresenter Content=\"{0}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Grid.ColumnSpan=\"{1}\" />", parent, offsetNum));
            sb.AppendLine(string.Format("<Rectangle Fill=\"#FFC9CACA\" VerticalAlignment=\"Stretch\" Height=\"1\" Grid.Row=\"1\" Grid.ColumnSpan=\"{0}\" />", offsetNum));
            //增加明细头显示
            int n = 0;
            for (int i = 0; i < list.Count; i++)
            {
                var key = list[i];
                if (i > 0)
                {
                    n++;
                    sb.AppendLine(string.Format("<Rectangle Fill=\"#FFC9CACA\" VerticalAlignment=\"Stretch\" Width=\"1\" Visibility=\"Visible\" Grid.Row=\"2\" Grid.Column=\"{0}\" />", n));
                    n++;
                }
                sb.AppendLine(string.Format("<ContentPresenter Content=\"{0}\" Grid.Row=\"2\" Grid.Column=\"{1}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />", key, n));
            }
            //合成模板 填写你的HeaderStyle.xaml所在的路径 /...../HeaderStyle.xaml
            var res = Application.GetResourceStream(new Uri("/UH;component/../../MyStyle/HeaderStyle.xaml", UriKind.Relative));


            var sr = new StreamReader(res.Stream);
            var h_style = sr.ReadToEnd();
            h_style = h_style.Replace("{#replace#}", sb.ToString());
            //生成样式
            column.HeaderStyle = (Style)XamlReader.Load(h_style);
            #endregion
            sb.Clear();
            #region 生成CELL模板
            sb.AppendLine("<Grid.ColumnDefinitions>");
            for (int i = 0; i < list.Count; i++)
            {
                if (i > 0)
                    sb.AppendLine("<ColumnDefinition Width=\"1\" />");
                sb.AppendLine("<ColumnDefinition Width=\"80*\"/>");
            }
            sb.AppendLine("</Grid.ColumnDefinitions>");
            //增加明细显示
            n = 0;
            for (int i = 0; i < list.Count; i++)
            {
                var key = list[i];
                if (i > 0)
                {
                    n++;
                    sb.AppendLine(string.Format("<Rectangle Fill=\"#FFC9CACA\" VerticalAlignment=\"Stretch\" Grid.Column=\"{0}\"/>", n));
                    n++;
                }
                sb.AppendLine("<TextBlock Height=\"30\" Text=\"{Binding " + bindings[key] + "}\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"  Grid.Column=\"" + n + "\" />");
            }
            //合成模板
            res = Application.GetResourceStream(new Uri("/UH;component/../../MyStyle/CellDataTemplate.xaml", UriKind.Relative));
            var sr2 = new StreamReader(res.Stream);
            var cell_Template = sr2.ReadToEnd();
            cell_Template = cell_Template.Replace("{#replace#}", sb.ToString());
            //生成样式
            column.CellTemplate = (DataTemplate)XamlReader.Load(cell_Template);
            #endregion


            return column;
        }



      //用法例子

                //添加简单的列
            DataGridTemplateColumn Number1 = UHService.CreateSingleTemplateColumn("序号", 0, "Number");
            Number1.Width = new DataGridLength(100);


            //添加复杂的列
            Dictionary<string, string> mm = new Dictionary<string, string>();
            mm.Add("哈哈", "hh");//他下边的列
            mm.Add("嘿嘿", "xx");
            DataGridTemplateColumn Number2 = UHService.CreateComplexTemplateColumn("序号", mm);
            Number2.Width = new DataGridLength(100);


            testDataGrid.Columns.Add(Number1);
            testDataGrid.Columns.Add(Number2);

            //绑定值测试
            List<Dictionary<string, string>> hx = new List<Dictionary<string, string>>();
            Dictionary<string, string> mx = new Dictionary<string, string>();
            mx.Add("Number", "1");
            mx.Add("hh", "妹子");
            mx.Add("xx", "妹子");
            Dictionary<string, string> mx2 = new Dictionary<string, string>();
            mx2.Add("Number", "2");
            mx2.Add("xx", "妹子");
            mx2.Add("hh", "妹子");
            hx.Add(mx);
            hx.Add(mx2);


            List<object> jj = UHService.GetEnumerable(hx).ToDataSource();
            testDataGrid.ItemsSource = jj;




原创粉丝点击