bool MoveToNextStoredMember ()
{
if (MoveToNextMarkupExtensionAttributeMember ())
return true;
if (stored_member_enumerator != null) {
// FIXME: value might have to be deserialized.
switch (node_type) {
case XamlNodeType.StartObject:
case XamlNodeType.EndMember:
// -> StartMember
if (stored_member_enumerator.MoveNext ()) {
current = current_member = stored_member_enumerator.Current.Key;
node_type = XamlNodeType.StartMember;
return true;
}
break;
case XamlNodeType.StartMember:
// -> Value or StartObject (of MarkupExtension)
var v = stored_member_enumerator.Current.Value;
current = v;
// Try markup extension
// FIXME: is this rule correct?
if (!String.IsNullOrEmpty (v) && v [0] == '{') {
var pai = ParsedMarkupExtensionInfo.Parse (v, xaml_namespace_resolver, sctx);
types.Push (pai.Type);
current = pai.Type;
node_type = XamlNodeType.StartObject;
markup_extension_attr_members = pai.Arguments.GetEnumerator ();
}
else
node_type = XamlNodeType.Value;
return true;
case XamlNodeType.EndObject: // of MarkupExtension
case XamlNodeType.Value:
// -> EndMember
current = null;
node_type = XamlNodeType.EndMember;
return true;
}
}
stored_member_enumerator = null;
return false;
}