2020-03-31 11:00:09 +00:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Windows.Markup;
|
|
|
|
|
|
|
2020-04-21 09:12:17 +00:00
|
|
|
|
namespace Flow.Launcher.Infrastructure.UI
|
2020-03-31 11:00:09 +00:00
|
|
|
|
{
|
|
|
|
|
|
public class EnumBindingSourceExtension : MarkupExtension
|
|
|
|
|
|
{
|
|
|
|
|
|
private Type _enumType;
|
|
|
|
|
|
public Type EnumType
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return _enumType; }
|
|
|
|
|
|
set
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != _enumType)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (value != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
Type enumType = Nullable.GetUnderlyingType(value) ?? value;
|
|
|
|
|
|
if (!enumType.IsEnum)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new ArgumentException("Type must represent an enum.");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_enumType = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public EnumBindingSourceExtension() { }
|
|
|
|
|
|
|
|
|
|
|
|
public EnumBindingSourceExtension(Type enumType)
|
|
|
|
|
|
{
|
|
|
|
|
|
EnumType = enumType;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override object ProvideValue(IServiceProvider serviceProvider)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_enumType == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new InvalidOperationException("The EnumType must be specified.");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Type actualEnumType = Nullable.GetUnderlyingType(_enumType) ?? _enumType;
|
|
|
|
|
|
Array enumValues = Enum.GetValues(actualEnumType);
|
|
|
|
|
|
|
|
|
|
|
|
if (actualEnumType == _enumType)
|
|
|
|
|
|
{
|
|
|
|
|
|
return enumValues;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Array tempArray = Array.CreateInstance(actualEnumType, enumValues.Length + 1);
|
|
|
|
|
|
enumValues.CopyTo(tempArray, 1);
|
|
|
|
|
|
return tempArray;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|