Я читаю ваш вопрос немного иначе, чем другие ответчики. Я не думаю, что вы просто ищете способ связать перечисление с комбо, я думаю, что вы ищете способ связать значение перечисления с тип объекта. Если я ошибся, перестаньте читать:)
Сначала: Я не уверен, что сохранение типов формы в качестве перечисления (или даже связывание формы с перечислением) очень масштабируемо. Продолжайте читать, и я объясню к концу.
Чтобы связать тип элемента с перечислением, просто заставьте элемент вернуть соответствующее значение перечисления через свойство:
public CircleViewMode
{
public ShapeType Shape { get { return ShapeType.Circle; }}
}
public enum ShapeType
{
Circle,
Square,
Rectangle,
Triangle,
FancyShape1,
FancyShape2
}
Это означает, что вам не нужно использовать конвертер или другой механизм переводчика. Если вы хотите затем объединить их в комбо, то это довольно просто - проверьте следующий пример и вставьте точки останова в соответствующем месте, чтобы увидеть, как это работает.
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
new Example().Run();
Console.ReadKey();
}
}
public class Example : INotifyPropertyChanged
{
public void Run()
{
var availableShapes = AllMyShapes.Where(x => x.NumberOfSides == 4);
AvailableShapes = new List<KeyValuePair<string, Type>>
(from Shape s in availableShapes
select new KeyValuePair<string, Type>(
Enum.GetName(typeof(ShapeType), s.ShapeType)
,s.GetType()
));
//at this point any combobox you have bound to the AvailableShapes property will now carry a new list of shapes
}
public List<Shape> AllMyShapes
{
get
{
return new List<Shape>() { new Circle(){NumberOfSides=1, ShapeType=ShapeType.Circle}
,new Square(){NumberOfSides=4, ShapeType=ShapeType.Square}
,new Rectangle(){NumberOfSides=4, ShapeType=ShapeType.Rectangle}
,new Triangle(){NumberOfSides=3, ShapeType=ShapeType.Triangle}
,new FancyShape1(){NumberOfSides=10, ShapeType=ShapeType.FancyShape1}
,new FancyShape2(){NumberOfSides=30, ShapeType=ShapeType.FancyShape2}
};
}
}
public List<KeyValuePair<string, Type>> AvailableShapes
{
get { return _availableShapes; }
protected set
{
_availableShapes = value;
}
}
protected void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
private List<KeyValuePair<string, Type>> _availableShapes;
public event PropertyChangedEventHandler PropertyChanged;
}
public abstract class Shape
{
public int NumberOfSides { get; set; }
public ShapeType ShapeType { get; set; }
}
public class Square : Shape { }
public class Rectangle : Shape { }
public class Triangle : Shape { }
public class Circle : Shape { }
public class FancyShape1 : Shape { }
public class FancyShape2 : Shape { }
public enum ShapeType
{
Circle,
Square,
Rectangle,
Triangle,
FancyShape1,
FancyShape2
}
}
При таком подходе у вас будет комбинированный список с красивыми удобочитаемыми именами фигур, и вы сможете мгновенно получить фактический тип формы выбранного элемента. Было бы тривиальной задачей превратить класс Example
в абстрактную базовую ViewModel, любая производная от него модель ViewModel будет иметь свойство AvailableShapes
.
Но вернемся к моей первоначальной точке масштабирования - по мере увеличения типов фигур вам также необходимо обновить перечисление. Это может быть проблематично, если вы отправляете библиотеки новых фигур или позволяете пользователям создавать свои собственные. Возможно, лучше сохранить его как myShape.GetType().ToString()
, который возвращает строковое значение, которое затем можно использовать для воссоздания экземпляра объекта с использованием отражения. В приведенном выше примере показа элементов в комбинированном списке вы можете просто получить List<Type>
доступных фигур и использовать конвертер для создания удобного для чтения человеком имени из типа фигуры (используя файл строковых ресурсов, полностью исключая перечисление). ).