private static object ConvertPropertyPath (XamlTypeConverter converter, ITypeDescriptorContext context, CultureInfo culture, object value)
{
string typename;
string propertyname;
string index;
PropertyNodeType node;
string str = (string) value;
// Fastpath - if there are no prefixed types then we have nothing to expand
if (!str.Contains (":"))
return new PropertyPath (str);
var parser = new PropertyPathParser (str);
var expanded = new StringBuilder ();
while ((node = parser.Step (out typename, out propertyname, out index)) != PropertyNodeType.None) {
switch (node) {
case PropertyNodeType.AttachedProperty:
if (expanded.Length > 0)
expanded.Append ('.');
if (typename.Contains (":")) {
typename = converter.parser.ResolveType (typename).ToString ();
expanded.AppendFormat ("('{0}'.{1})", typename, propertyname);
} else {
expanded.AppendFormat ("({0}.{1})", typename, propertyname);
}
break;
case PropertyNodeType.Indexed:
expanded.AppendFormat ("[{0}]", index);
break;
case PropertyNodeType.Property:
if (expanded.Length > 0)
expanded.Append ('.');
expanded.Append (propertyname);
break;
default:
throw new Exception (string.Format ("Could not handle PropertyNodeType.{0}", node));
}
}
return new PropertyPath (str, expanded.ToString ());
}