Browse Source

bugfix : Collection Instance == 0 fixes: Animation1 Unit Test

pull/584/head
jkuehner 11 years ago
parent
commit
e53c26fb04
  1. 80
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs

80
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs

@ -22,6 +22,7 @@ using System.ComponentModel;
using System.Globalization; using System.Globalization;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq;
using System.Reflection; using System.Reflection;
using System.Windows; using System.Windows;
using System.Windows.Interop; using System.Windows.Interop;
@ -326,37 +327,53 @@ namespace ICSharpCode.WpfDesign.XamlDom
} }
} }
} }
foreach (XmlNode childNode in elementChildNodes) { if (collectionType != null && collectionInstance == null && elementChildNodes.Count() == 1)
XmlElement childElement = childNode as XmlElement; {
if (childElement != null) { var firstChild = elementChildNodes.First() as XmlElement;
if (childElement.NamespaceURI == XamlConstants.XamlNamespace) if (ObjectChildElementIsCollectionInstance(firstChild, collectionType))
continue; {
collectionInstance = ParseObject(firstChild);
collectionProperty.PropertyValue = (XamlPropertyValue) collectionInstance;
}
else
{
throw new XamlLoadException("Collection Instance is null");
}
}
else
{
foreach (XmlNode childNode in elementChildNodes) {
XmlElement childElement = childNode as XmlElement;
if (childElement != null) {
if (childElement.NamespaceURI == XamlConstants.XamlNamespace)
continue;
if (ObjectChildElementIsPropertyElement(childElement)) { if (ObjectChildElementIsPropertyElement(childElement)) {
ParseObjectChildElementAsPropertyElement(obj, childElement, defaultProperty); ParseObjectChildElementAsPropertyElement(obj, childElement, defaultProperty);
continue; continue;
} }
} }
if (initializeFromTextValueInsteadOfConstructor != null) if (initializeFromTextValueInsteadOfConstructor != null)
continue; continue;
XamlPropertyValue childValue = ParseValue(childNode); XamlPropertyValue childValue = ParseValue(childNode);
if (childValue != null) { if (childValue != null) {
if (collectionProperty != null) { if (collectionProperty != null) {
collectionProperty.ParserAddCollectionElement(collectionPropertyElement, childValue); collectionProperty.ParserAddCollectionElement(collectionPropertyElement, childValue);
CollectionSupport.AddToCollection(collectionType, collectionInstance, childValue); CollectionSupport.AddToCollection(collectionType, collectionInstance, childValue);
} else { } else {
if (defaultProperty == null) if (defaultProperty == null)
throw new XamlLoadException("This element does not have a default value, cannot assign to it"); throw new XamlLoadException("This element does not have a default value, cannot assign to it");
if (isDefaultValueSet) if (isDefaultValueSet)
throw new XamlLoadException("default property may have only one value assigned"); throw new XamlLoadException("default property may have only one value assigned");
obj.AddProperty(new XamlProperty(obj, defaultProperty, childValue)); obj.AddProperty(new XamlProperty(obj, defaultProperty, childValue));
isDefaultValueSet = true; isDefaultValueSet = true;
} }
} }
} }
}
} }
IEnumerable<XmlNode> GetNormalizedChildNodes(XmlElement element) IEnumerable<XmlNode> GetNormalizedChildNodes(XmlElement element)
@ -581,7 +598,12 @@ namespace ICSharpCode.WpfDesign.XamlDom
{ {
return element.LocalName.Contains("."); return element.LocalName.Contains(".");
} }
static bool ObjectChildElementIsCollectionInstance(XmlElement element, Type collectionType)
{
return element.Name == collectionType.Name;
}
static bool IsElementChildACollectionForProperty(XamlTypeFinder typeFinder, XmlElement element, XamlPropertyInfo propertyInfo) static bool IsElementChildACollectionForProperty(XamlTypeFinder typeFinder, XmlElement element, XamlPropertyInfo propertyInfo)
{ {
return element.ChildNodes.Count == 1 && propertyInfo.ReturnType.IsAssignableFrom(FindType(typeFinder, element.FirstChild.NamespaceURI, element.FirstChild.LocalName)); return element.ChildNodes.Count == 1 && propertyInfo.ReturnType.IsAssignableFrom(FindType(typeFinder, element.FirstChild.NamespaceURI, element.FirstChild.LocalName));

Loading…
Cancel
Save