Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow bind Enum values in IAutoInitialize ViewModels #1916

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions Source/Prism.Tests/Mvvm/AutoInitializeViewModelFixture.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
using System.Collections.Generic;
using System.Linq;
using Prism.Common;
using Xunit;

namespace Prism.Tests.Mvvm
{
internal class MockParameters : ParametersBase
{
public MockParameters() : base() { }
public MockParameters(string query) : base(query) { }
}

internal enum MockEnum
{
None = 0,
Foo = 1,
Bar = 2,
Fizz = 3
}
Comment on lines +8 to +20
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

each type should be in its own file. Also mocks belong under the Mocks namespace


public class AutoInitializeViewModelFixture
{
[Fact]
public void TryGetValueOfT()
{
var parameters = new MockParameters("mock=Foo&mock2=1");
bool success = false;
MockEnum value = default;
MockEnum value1 = default;

var ex = Record.Exception(() => success = parameters.TryGetValue<MockEnum>("mock", out value));
var ex2 = Record.Exception(() => success = parameters.TryGetValue<MockEnum>("mock2", out value1));
Assert.Null(ex);
Assert.True(success);
Assert.Equal(MockEnum.Foo, value);
Assert.Equal(value, value1);
}

[Fact]
public void GetValuesOfT()
{
var parameters = new MockParameters("mock=Foo&mock=2&mock=Fizz");
bool success = false;
IEnumerable<MockEnum> values = default;

var ex = Record.Exception(() => values = parameters.GetValues<MockEnum>("mock"));
Assert.Null(ex);
Assert.Equal(3, values.Count());
Assert.Equal(MockEnum.Foo, values.ElementAt(0));
Assert.Equal(MockEnum.Bar, values.ElementAt(1));
Assert.Equal(MockEnum.Fizz, values.ElementAt(2));
}


[Fact]
public void GetValue()
{
var parameters = new MockParameters("mock=Foo&mock1=2&mock2=Fizz");
MockEnum value = default;
MockEnum value1 = default;

var ex = Record.Exception(() => value = parameters.GetValue<MockEnum>("mock"));
var ex2 = Record.Exception(() => value1 = parameters.GetValue<MockEnum>("mock1"));
Assert.Null(ex);
Assert.Equal(MockEnum.Foo, value);
Assert.Equal(MockEnum.Bar, value1);
}
}
}
21 changes: 15 additions & 6 deletions Source/Prism/Common/ParametersExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public static object GetValue(this IEnumerable<KeyValuePair<string, object>> par
return kvp.Value;
else if (type.IsAssignableFrom(kvp.Value.GetType()))
return kvp.Value;
else if (type.IsEnum && Enum.IsDefined(type, kvp.Value.ToString()))
return Enum.Parse(type, kvp.Value.ToString());
else
return Convert.ChangeType(kvp.Value, type);
}
Expand All @@ -36,18 +38,22 @@ public static object GetValue(this IEnumerable<KeyValuePair<string, object>> par
[EditorBrowsable(EditorBrowsableState.Never)]
public static bool TryGetValue<T>(this IEnumerable<KeyValuePair<string, object>> parameters, string key, out T value)
{
var type = typeof(T);

foreach (var kvp in parameters)
{
if (string.Compare(kvp.Key, key, StringComparison.Ordinal) == 0)
{
if (kvp.Value == null)
value = default;
else if (kvp.Value.GetType() == typeof(T))
else if (kvp.Value.GetType() == type)
value = (T)kvp.Value;
else if (typeof(T).IsAssignableFrom(kvp.Value.GetType()))
else if (type.IsAssignableFrom(kvp.Value.GetType()))
value = (T)kvp.Value;
else if (type.IsEnum && Enum.IsDefined(type, kvp.Value.ToString()))
value = (T)Enum.Parse(type, kvp.Value.ToString());
else
value = (T)Convert.ChangeType(kvp.Value, typeof(T));
value = (T)Convert.ChangeType(kvp.Value, type);

return true;
}
Expand All @@ -61,19 +67,22 @@ public static bool TryGetValue<T>(this IEnumerable<KeyValuePair<string, object>>
public static IEnumerable<T> GetValues<T>(this IEnumerable<KeyValuePair<string, object>> parameters, string key)
{
List<T> values = new List<T>();
var type = typeof(T);

foreach (var kvp in parameters)
{
if (string.Compare(kvp.Key, key, StringComparison.Ordinal) == 0)
{
if (kvp.Value == null)
values.Add(default);
else if (kvp.Value.GetType() == typeof(T))
else if (kvp.Value.GetType() == type)
values.Add((T)kvp.Value);
else if (typeof(T).IsAssignableFrom(kvp.Value.GetType()))
else if (type.IsAssignableFrom(kvp.Value.GetType()))
values.Add((T)kvp.Value);
else if (type.IsEnum && Enum.IsDefined(type, kvp.Value.ToString()))
values.Add((T)Enum.Parse(type, kvp.Value.ToString()));
else
values.Add((T)Convert.ChangeType(kvp.Value, typeof(T)));
values.Add((T)Convert.ChangeType(kvp.Value, type));
}
}

Expand Down