/// <summary> /// Write start of a complex property /// </summary> /// <remarks> /// For template parsing, treat complex property tags as /// xml element tags for the purpose of validity checking /// </remarks> public override void WritePropertyComplexStart(XamlPropertyComplexStartNode xamlNode) { StyleMode mode = _styleModeStack.Mode; if (_styleModeStack.Depth == 1) { if (xamlNode.PropName == XamlTemplateSerializer.TargetTypePropertyName) { mode = StyleMode.TargetTypeProperty; } else if (xamlNode.PropName == XamlTemplateSerializer.DataTypePropertyName) { mode = StyleMode.DataTypeProperty; } else if (xamlNode.PropName == XamlTemplateSerializer.ItemsSourcePropertyName || xamlNode.PropName == XamlTemplateSerializer.ItemTemplatePropertyName || xamlNode.PropName == XamlTemplateSerializer.ItemTemplateSelectorPropertyName || xamlNode.PropName == XamlTemplateSerializer.ItemContainerStylePropertyName || xamlNode.PropName == XamlTemplateSerializer.ItemContainerStyleSelectorPropertyName || xamlNode.PropName == XamlTemplateSerializer.ItemStringFormatPropertyName || xamlNode.PropName == XamlTemplateSerializer.ItemBindingGroupPropertyName || xamlNode.PropName == XamlTemplateSerializer.AlternationCountPropertyName ) { mode = StyleMode.ComplexProperty; } else { ThrowException(SRID.TemplateUnknownProp, xamlNode.PropName, xamlNode.LineNumber, xamlNode.LinePosition); } } else if (mode == StyleMode.VisualTree) { _visualTreeComplexPropertyDepth++; } else if (mode == StyleMode.TriggerBase) { _triggerComplexPropertyDepth++; } #if PBTCOMPILER else if (mode == StyleMode.DataTypeProperty && InDeferLoadedSection && !_defNameFound) { // We have to treat DataType="{x:Type SomeType}" as a key in a // resource dictionary, if one is present. This means generating // a series of baml records to use as the key for the defer loaded // body of the Style in addition to generating the records to set // the TargetType value. base.WritePropertyComplexStart(xamlNode); } #endif _styleModeStack.Push(mode); base.WritePropertyComplexStart(xamlNode); }
/// <summary> /// Create nodes for a complex property that surrounds an element tree. /// Note that this is for general properties and not def attributes. /// </summary> internal void CompileAttribute( ArrayList xamlNodes, AttributeData data) { // For MarkupExtension syntax, treat PropertyInfo as a CLR property, but MethodInfo // and DependencyProperty as a DependencyProperty. Note that the MarkupCompiler // will handle the case where a DependencyProperty callback is made if it gets // a MethodInfo for the attached property setter. string declaringTypeAssemblyName = data.DeclaringType.Assembly.FullName; string declaringTypeFullName = data.DeclaringType.FullName; // Find the PropertyRecordType to use in this case Type propertyType; bool propertyCanWrite; XamlTypeMapper.GetPropertyType(data.Info, out propertyType, out propertyCanWrite); BamlRecordType propertyRecordType = BamlRecordManager.GetPropertyStartRecordType(propertyType, propertyCanWrite); // Create the property start and end records XamlNode propertyStart; XamlNode propertyEnd; switch (propertyRecordType) { case BamlRecordType.PropertyArrayStart: { propertyStart = new XamlPropertyArrayStartNode( data.LineNumber, data.LinePosition, data.Depth, data.Info, declaringTypeAssemblyName, declaringTypeFullName, data.PropertyName); propertyEnd = new XamlPropertyArrayEndNode( data.LineNumber, data.LinePosition, data.Depth); break; } case BamlRecordType.PropertyIDictionaryStart: { propertyStart = new XamlPropertyIDictionaryStartNode( data.LineNumber, data.LinePosition, data.Depth, data.Info, declaringTypeAssemblyName, declaringTypeFullName, data.PropertyName); propertyEnd = new XamlPropertyIDictionaryEndNode( data.LineNumber, data.LinePosition, data.Depth); break; } case BamlRecordType.PropertyIListStart: { propertyStart = new XamlPropertyIListStartNode( data.LineNumber, data.LinePosition, data.Depth, data.Info, declaringTypeAssemblyName, declaringTypeFullName, data.PropertyName); propertyEnd = new XamlPropertyIListEndNode( data.LineNumber, data.LinePosition, data.Depth); break; } default: // PropertyComplexStart { propertyStart = new XamlPropertyComplexStartNode( data.LineNumber, data.LinePosition, data.Depth, data.Info, declaringTypeAssemblyName, declaringTypeFullName, data.PropertyName); propertyEnd = new XamlPropertyComplexEndNode( data.LineNumber, data.LinePosition, data.Depth); break; } } // NOTE: Add duplicate property checking here as is done in XamlReaderHelper xamlNodes.Add(propertyStart); CompileAttributeCore(xamlNodes, data); xamlNodes.Add(propertyEnd); }
/// <summary> /// Write Start Complex Property, where the tag is of the /// form /<Classname.PropertyName/> /// </summary> public virtual void WritePropertyComplexStart( XamlPropertyComplexStartNode xamlPropertyComplexStartNode) { if (BamlRecordWriter != null) { BamlRecordWriter.WritePropertyComplexStart(xamlPropertyComplexStartNode); } }
// Write the start of a complex property internal void WritePropertyComplexStart(XamlPropertyComplexStartNode xamlComplexPropertyNode) { // review same as property + flag, combine code BamlPropertyComplexStartRecord bamlComplexProperty = (BamlPropertyComplexStartRecord) BamlRecordManager.GetWriteRecord( BamlRecordType.PropertyComplexStart); bamlComplexProperty.AttributeId = MapTable.AddAttributeInfoMap(BinaryWriter, xamlComplexPropertyNode.AssemblyName, xamlComplexPropertyNode.TypeFullName, xamlComplexPropertyNode.PropDeclaringType, xamlComplexPropertyNode.PropName, xamlComplexPropertyNode.PropValidType, BamlAttributeUsage.Default); WriteAndReleaseRecord(bamlComplexProperty, xamlComplexPropertyNode); }