zoukankan      html  css  js  c++  java
  • [原] 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));

    运行结果:

     

  • 相关阅读:
    软件工程的国家标准下载链接
    电子计算机机房设计规范
    建筑物防雷设计规范
    信息系统项目管理师考试大纲
    计算机信息系统安全保护等级划分准则
    信息系统工程监理单位资质管理办法
    信息系统工程监理工程师资格管理办法
    计算机软件保护条例
    信息系统工程监理暂行规定
    第一个Winform 程序 (附一个需求实现,望大家帮忙)
  • 原文地址:https://www.cnblogs.com/think8848/p/1589285.html
Copyright © 2011-2022 走看看