TFS2010 - Использование TypeConverter для отображения пользовательского списка типов параметров.
Данная статья является переводом статьи Jason Prickett “TFS 2010 - Using a TypeConverter to display your custom Process Parameter list type”
«Как я могу получить мой пользовательский список параметров для отображения чего-либо, вместо слова ‘(Collection)’ в таблице свойств Process Parameters?»
Ответ на этот вопрос очень прост, если вы знакомы с таблицей свойств (property grid) в WindowsForms. Класс PropertyGrid ищет атрибуты конвертера типа в классах, чтобы определить, как их отображать. Для простого класса (не конвертируемого в строку), если вы ничего не предпримите, этот процесс просто вызовет ToString() для отображения текста, и текст будет доступен только для чтения. Для списка или коллекции, процесс не будет вызывать ToString. Вместо этого он отобразит ‘(Collection)’. И это значение также будет доступно только для чтения.
Однако, если добавить TypeConverter в ваш класс или список, вы можете сообщить PropertyGrid как отобразить ваш класс, или, даже как производить редактирование в таблице свойств. Ниже – приведен пример списка строк. Он содержит конвертер типов, который позволяет пользователю добавлять информацию к списку и просматривать его без необходимости использования специализированного редактора.
Замечание: данный класс является лишь простой демонстрацией. Например, он не поддерживает работу со строками, содержащими запятые.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
namespace MyCustomProcessParameters
{
[Serializable]
[TypeConverter(typeof(ListOfStringsTypeConverter))]
public class ListOfStrings : List<String>
{
public ListOfStrings()
: base()
{
}
public ListOfStrings(String list)
: base()
{
AddRange(list.Split(new char[] { }, StringSplitOptions.RemoveEmptyEntries));</span'
}
public override string ToString()
{
return String.Join(",", this);
}
}
internal class ListOfStringsTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return ((sourceType == typeof(String)) || base.CanConvertFrom(context, sourceType));
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return ((destinationType == typeof(String)) || base.CanConvertTo(context, destinationType));
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (!(value is String))
{
return base.ConvertFrom(context, culture, value);
}
return new ListOfStrings((String)value);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType != typeof(String) || !(value is ListOfStrings))
{
return base.ConvertTo(context, culture, value, destinationType);
}
return value.ToString();
}
}
}
Вот, как это выглядит в тестовом приложении, содержащем PropertyGrid:
На картинке выше вы можете видеть, что я добавил три свойства «только для чтения» к своему объекту, который позволяет мне отобразить каждый из элементов в списке.
Заметьте, что TypeConverter работает с типами параметров вашего процесса, возможно вам понадобится развернуть SP1 на TFS2010, и нужно убедиться, что ваши сборки находятся в нужной директории Visual Studio.