Browse Source

Added enum conversions to DefaultValueConverter.

pull/447/head
Steven Kirk 10 years ago
parent
commit
127133eb89
  1. 35
      src/Markup/Perspex.Markup/DefaultValueConverter.cs
  2. 10
      src/Perspex.Base/Utilities/TypeUtilities.cs
  3. 43
      tests/Perspex.Markup.UnitTests/DefaultValueConverterTests.cs

35
src/Markup/Perspex.Markup/DefaultValueConverter.cs

@ -3,6 +3,8 @@
using System;
using System.Globalization;
using System.Linq;
using System.Reflection;
using Perspex.Utilities;
namespace Perspex.Markup
@ -30,7 +32,9 @@ namespace Perspex.Markup
{
object result;
if (value != null && TypeUtilities.TryConvert(targetType, value, culture, out result))
if (value != null &&
(TypeUtilities.TryConvert(targetType, value, culture, out result) ||
TryConvertEnum(value, targetType, culture, out result)))
{
return result;
}
@ -52,5 +56,34 @@ namespace Perspex.Markup
{
return Convert(value, targetType, parameter, culture);
}
private bool TryConvertEnum(object value, Type targetType, CultureInfo cultur, out object result)
{
var valueTypeInfo = value.GetType().GetTypeInfo();
var targetTypeInfo = targetType.GetTypeInfo();
if (valueTypeInfo.IsEnum && !targetTypeInfo.IsEnum)
{
var enumValue = (int)value;
if (TypeUtilities.TryCast(targetType, enumValue, out result))
{
return true;
}
}
else if (!valueTypeInfo.IsEnum && targetTypeInfo.IsEnum)
{
object intValue;
if (TypeUtilities.TryCast(typeof(int), value, out intValue))
{
result = Enum.ToObject(targetType, intValue);
return true;
}
}
result = null;
return false;
}
}
}

10
src/Perspex.Base/Utilities/TypeUtilities.cs

@ -119,6 +119,12 @@ namespace Perspex.Utilities
return true;
}
if (to == typeof(string))
{
result = Convert.ToString(value);
return true;
}
if (to.GetTypeInfo().IsEnum && from == typeof(string))
{
if (Enum.IsDefined(to, (string)value))
@ -131,9 +137,7 @@ namespace Perspex.Utilities
bool containsFrom = Conversions.ContainsKey(from);
bool containsTo = Conversions.ContainsKey(to);
if ((containsFrom && containsTo) ||
(from == typeof(string) && containsTo) ||
(to == typeof(string) && containsFrom))
if ((containsFrom && containsTo) || (from == typeof(string) && containsTo))
{
try
{

43
tests/Perspex.Markup.UnitTests/DefaultValueConverterTests.cs

@ -2,6 +2,7 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System.Globalization;
using Perspex.Controls;
using Xunit;
namespace Perspex.Markup.UnitTests
@ -44,6 +45,18 @@ namespace Perspex.Markup.UnitTests
Assert.Equal(TestEnum.Bar, result);
}
[Fact]
public void Can_Convert_Int_To_Enum()
{
var result = DefaultValueConverter.Instance.Convert(
1,
typeof(TestEnum),
null,
CultureInfo.InvariantCulture);
Assert.Equal(TestEnum.Bar, result);
}
[Fact]
public void Can_Convert_Double_To_String()
{
@ -57,15 +70,27 @@ namespace Perspex.Markup.UnitTests
}
[Fact]
public void Can_Convert_Double_To_Int()
public void Can_Convert_Enum_To_Int()
{
var result = DefaultValueConverter.Instance.Convert(
5.0,
TestEnum.Bar,
typeof(int),
null,
CultureInfo.InvariantCulture);
Assert.Equal(5, result);
Assert.Equal(1, result);
}
[Fact]
public void Can_Convert_Enum_To_String()
{
var result = DefaultValueConverter.Instance.Convert(
TestEnum.Bar,
typeof(string),
null,
CultureInfo.InvariantCulture);
Assert.Equal("Bar", result);
}
[Fact]
@ -80,6 +105,18 @@ namespace Perspex.Markup.UnitTests
Assert.Equal(5.0, result);
}
[Fact]
public void Cannot_Convert_Between_Different_Enum_Types()
{
var result = DefaultValueConverter.Instance.Convert(
TestEnum.Foo,
typeof(Orientation),
null,
CultureInfo.InvariantCulture);
Assert.Equal(PerspexProperty.UnsetValue, result);
}
private enum TestEnum
{
Foo,

Loading…
Cancel
Save