Данная статья является переводом статьи 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)
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.