转载请注明出处
现有需求:
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;
}
}
{
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
}
{
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();
}
}
{
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};
}
{
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>
</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;
}
}
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));
运行结果: