Browse Source

Can now bind to a non-IList/Array indexer (with any parameter type convertible via TypeUtilities).

pull/446/head
Jeremy Koritzinsky 11 years ago
parent
commit
74cea95956
  1. 30
      src/Markup/Perspex.Markup/Data/IndexerNode.cs
  2. 8
      src/Markup/Perspex.Markup/Data/Parsers/ArgumentListParser.cs
  3. 10
      tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Indexer.cs

30
src/Markup/Perspex.Markup/Data/IndexerNode.cs

@ -1,10 +1,12 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Perspex.Utilities;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Globalization;
using System.Linq;
using System.Reflection;
@ -104,6 +106,34 @@ namespace Perspex.Markup.Data
return list[_intArgs[0]];
}
}
else
{
PropertyInfo indexerProperty = null;
ParameterInfo[] indexerParameters = null;
foreach (var property in typeInfo.DeclaredProperties)
{
var indexParams = property.GetIndexParameters();
if (indexParams.Length > 0)
{
indexerProperty = property;
indexerParameters = indexParams;
}
}
if (indexerProperty != null && indexerParameters.Length == Arguments.Count)
{
var convertedObjectArray = new object[indexerParameters.Length];
for (int i = 0; i < Arguments.Count; i++)
{
object temp = null;
if (!TypeUtilities.TryConvert(indexerParameters[i].ParameterType, Arguments[i], CultureInfo.InvariantCulture, out temp))
{
return PerspexProperty.UnsetValue;
}
convertedObjectArray[i] = temp;
}
return indexerProperty.GetValue(target, convertedObjectArray);
}
}
return PerspexProperty.UnsetValue;
}

8
src/Markup/Perspex.Markup/Data/Parsers/ArgumentListParser.cs

@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Perspex.Markup.Data.Parsers
{
@ -26,7 +27,12 @@ namespace Perspex.Markup.Data.Parsers
}
else
{
throw new ExpressionParseException(r.Position, "Expected integer.");
var builder = new StringBuilder();
while (!r.End && r.Peek != ',' && r.Peek != close)
{
builder.Append(r.Take());
}
result.Add(builder.ToString());
}
r.SkipWhitespace();

10
tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Indexer.cs

@ -32,6 +32,16 @@ namespace Perspex.Markup.UnitTests.Data
Assert.Equal("qux", result);
}
[Fact]
public async void Should_Get_Value_For_Non_Integer_Indexer()
{
var data = new { Foo = new Dictionary<string, string> { { "foo", "bar" }, { "baz", "qux" } } };
var target = new ExpressionObserver(data, "Foo[foo]");
var result = await target.Take(1);
Assert.Equal("bar", result);
}
[Fact]
public async void Array_Out_Of_Bounds_Should_Return_UnsetValue()
{

Loading…
Cancel
Save