转载请注明出处
现有需求:
1.DataGrid的列是运行时定义的。
2.DataGrid的一个列需要显示图片,并且与该列绑定的数据是枚举(int)类型。
下列代码是DataGrid行显示的对象
{
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定义如下:
{
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类:
{
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的列吧
{
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 >
为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;
}
}
添加条数据看看效果:
运行结果: