转载请注明出处

现有需求:

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

 

运行结果:

 

posted on 2009-10-24 21:07  think8848  阅读(3940)  评论(6编辑  收藏  举报