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));

    运行结果:

     

  • 相关阅读:
    Java for LeetCode 229 Majority Element II
    Java for LeetCode 228 Summary Ranges
    Java for LeetCode 227 Basic Calculator II
    Java for LintCode 颜色分类
    Java for LintCode 链表插入排序
    Java for LintCode 颠倒整数
    Java for LintCode 验证二叉查找树
    Java for LeetCode 226 Invert Binary Tree
    Java for LeetCode 225 Implement Stack using Queues
    Java for LeetCode 224 Basic Calculator
  • 原文地址:https://www.cnblogs.com/think8848/p/1589285.html
Copyright © 2011-2022 走看看