[原] Silverlight 3 DataGrid中定义列(DataGridTemplateColumn)

转载请注明出处

现有需求:

1.DataGrid的列是运行时定义的。

2.DataGrid的一个列需要显示图片,并且与该列绑定的数据是枚举(int)类型。

下列代码是DataGrid行显示的对象

  public   class  MessageInfo
    {
        
public  MessageInfo()
        {
        }

        
public  MessageInfo(MessageInfoIcon messageIcon,  string  message, DateTime time)
        {
            
this .Icon  =  messageIcon;
            
this .Message  =  message;
            
this .Time  =  time;
        }

        
public  MessageInfoIcon Icon
        {
            
get ;
            
set ;
        }

        
public   string  Message
        {
            
get ;
            
set ;
        }

        
public  DateTime Time
        {
            
get ;
            
set ;
        }
    }

 

其中MessageInfoIcon定义如下:

 

     public   enum  MessageInfoIcon :  int
    {
        None 
=   0 ,

        Information 
=   1 ,

        Success 
=   2 ,

        Warning 
=   3 ,

        Error 
=   4 ,

        Invalidation 
=   5
    }

 

在定义DataGrid的列时发现一个比较麻烦的问题,DataGrid的列只有三种类型:DataGridTextColumn、DataGridCheckBoxColumn和DataGridTemplateColumn,很显然,没有DataGridImageColumn,只能使用自已定制了,更麻烦的事紧接着又来了,居然发现DataTemplate在代码中如何使用(如果有兄弟发现在代码中使用DataTemplate的方法请通知我),于是想起了XamlReader这个对象。

本来我是想做一个动态显示消息的控件,当用户进行了某种操作后将操作结果发送到该控件,很显然,消息所显示的图标可以枚举的,一个可以枚举的值使用string类型似乎不是一件好事,但是如果使用了枚举值,则至少要在程序运行时,将枚举值转换为string类型,这样才能使Image.Source的绑定正常工作。

为了将枚举值转换为string,我定义了一个Converter类:

 

    public   class  MessageInfoIconConverter : IValueConverter
    {
        
private   const   string  IMG_PATH  =   @" /CleverSoft.UI.SLControls;component/PageFrame/Images/ " ;

        
public   object  Convert( object  value, System.Type targetType,  object  parameter, System.Globalization.CultureInfo culture)
        {
            MessageInfoIcon icon 
=  (MessageInfoIcon)value;

            
switch  (icon)
            {
                
case  MessageInfoIcon.None:
                    {
                        
return  IMG_PATH  +   " info.png " ;
                    }
                
case  MessageInfoIcon.Information:
                    {
                        
return  IMG_PATH  +   " info.png " ;
                    }
                
case  MessageInfoIcon.Success:
                    {
                        
return  IMG_PATH  +   " info.png " ;
                    }
                
case  MessageInfoIcon.Warning:
                    {
                        
return  IMG_PATH  +   " info.png " ;
                    }
                
case  MessageInfoIcon.Error:
                    {
                        
return  IMG_PATH  +   " info.png " ;
                    }
                
default :
                    {
                        
return  IMG_PATH  +   " info.png " ;
                    }
            }
        }

        
public   object  ConvertBack( object  value, System.Type targetType,  object  parameter, System.Globalization.CultureInfo culture)
        {
            
throw   new  System.NotImplementedException();
        }
    }

 

OK,万事具备,现在来正式定义DataGrid的列吧

 

         private  DataGridColumn[] GetMessageInfoColumns()
        {
            DataGridTemplateColumn colIcon 
=   new  DataGridTemplateColumn();
            StringBuilder sbIcon 
=   new  StringBuilder();
            sbIcon.Append(
" <DataTemplate  " );
            sbIcon.Append(
" xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'  " );
            sbIcon.Append(
" xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'  " );
            sbIcon.Append(
" xmlns:local='clr-namespace:CleverSoft.UI.SLControls;assembly=CleverSoft.UI.SLControls'  " );
            sbIcon.Append(
" > " );
            sbIcon.Append(
" <Grid> " );
            sbIcon.Append(
" <Grid.Resources> " );
            sbIcon.Append(
" <local:MessageInfoIconConverter x:Key='MessageInfoIconConverter' /> " );
            sbIcon.Append(
" </Grid.Resources> " );  
            sbIcon.Append(
" <Image Width='16' Height='16' Source='{Binding Icon, Converter={StaticResource MessageInfoIconConverter}}'/> " );
            sbIcon.Append(
" </Grid> " );
            sbIcon.Append(
" </DataTemplate> " );
            colIcon.CellTemplate 
=  XamlReader.Load(sbIcon.ToString())  as  DataTemplate;

            DataGridTextColumn colMessage 
=   new  DataGridTextColumn();
            colMessage.Header 
=   " Message " ;
            colMessage.Binding 
=   new  Binding( " Message " );

            DataGridTextColumn colTime 
=   new  DataGridTextColumn();
            colTime.Header 
=   " Time " ;
            colTime.Binding 
=   new  Binding( " Time " );

            
return   new  DataGridColumn[] { colIcon,colMessage,colTime};
        }

 

页面DataGrid声明如下:

 

< data:DataGrid  x:Name ="dgInformations"  Height ="100"  Grid.Column ="0"  AutoGenerateColumns ="False" >   

</ data:DataGrid >

 

为DataGrid添加列以及绑定数据如下:

 

         // 在适当的方法内使用下面三行代码,为DataGrid添加列并绑定数据源
         this .AddDataGridColumns( this .GetMessageInfoColumns());
        
this .dgInformations.DataContext  =   this .Messages;
        
this .dgInformations.ItemsSource  =   this .Messages;

        
private   void  AddDataGridColumns(DataGridColumn[] columns)
        {
            
foreach  (DataGridColumn column  in  columns)
            {
                
this .dgInformations.Columns.Add(column);
            }
        }

        
internal  ObservableCollection < MessageInfo >  Messages
        {
            
get
            {
                
if  ( this .messages  ==   null )
                {
                    
this .messages  =   new  ObservableCollection < MessageInfo > ();
                }

                
return   this .messages;
            }
        }

 

添加条数据看看效果:

 

Messages.Add( new  MessageInfo(MessageInfoIcon.Information,  " Hello think8848 " , DateTime.Now));

 

运行结果:

 

转载于:https://www.cnblogs.com/think8848/archive/2009/10/24/1589285.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值