This question is locked. New answers and comments are not allowed.
I'm trying to replace the Code view of PropertyPath in {MF PropertyPath} to {MF DisplayName}, which still uses PropertyPath inside.
[XamlSerializable]public string DisplayName{ get { return _displayName.GetValue(); } set { if (!_displayName.IsNestedField && _displayName.GetValue() == value) return; _displayName.SetValue(value); InvalidateCode(); }}[XamlSerializable]public string PropertyPath{ get { return _propertyPath.GetValue(); } set { if (!_propertyPath.IsNestedField && _propertyPath.GetValue() == value) return; _propertyPath.SetValue(value); InvalidateCode(); }}They XamlSerializable, then there should be no problems.
But there is a problem with the implementation of CopyPropertiesFromCodeExpression.
protected override void CopyPropertiesFromCodeExpression(FieldCodeExpression fieldCodeExpression){ if (fieldCodeExpression.FieldArgumentNode != null) { _propertyPath.SetValue(fieldCodeExpression.FieldArgumentNode); _displayName.SetValue(fieldCodeExpression.FieldArgumentNode); } else { PropertyPath = null; DisplayName = null; }}
I get a blank page without this method. Otherwise, it tries to substitute the DisplayName in PropertyPath (???).
Full Code:
public class EnchantedMergeField : CodeBasedField{ public static readonly string FieldType = "MF"; public static readonly FieldPropertyDefinition PropertyPathProperty = new FieldPropertyDefinition("PropertyPath"); public static readonly FieldPropertyDefinition DisplayNameProperty = new FieldPropertyDefinition("DisplayName"); private readonly FieldProperty _propertyPath; private readonly FieldProperty _displayName; static EnchantedMergeField() { CodeBasedFieldFactory.RegisterFieldType(FieldType, () => new EnchantedMergeField()); } public EnchantedMergeField() { _propertyPath = new FieldProperty(this, PropertyPathProperty); _displayName = new FieldProperty(this, DisplayNameProperty); } public override string FieldTypeName { get { return FieldType; } } public override bool HasDisplayNameFragment { get { return true; } } [XamlSerializable] public string DisplayName { get { return _displayName.GetValue(); } set { if (!_displayName.IsNestedField && _displayName.GetValue() == value) return; _displayName.SetValue(value); InvalidateCode(); } } [XamlSerializable] public string PropertyPath { get { return _propertyPath.GetValue(); } set { if (!_propertyPath.IsNestedField && _propertyPath.GetValue() == value) return; _propertyPath.SetValue(value); InvalidateCode(); } } protected override void CopyPropertiesFromCodeExpression(FieldCodeExpression fieldCodeExpression) { if (fieldCodeExpression.FieldArgumentNode != null) { _propertyPath.SetValue(fieldCodeExpression.FieldArgumentNode); _displayName.SetValue(fieldCodeExpression.FieldArgumentNode); } else { PropertyPath = null; DisplayName = null; } } public override void CopyPropertiesFrom(Field fromField) { base.CopyPropertiesFrom(fromField); var mergeField = (EnchantedMergeField) fromField; _propertyPath.CopyPropertiesFrom(mergeField._propertyPath); _displayName.CopyPropertiesFrom(mergeField._displayName); } public override Field CreateInstance() { return new EnchantedMergeField(); } private string ConvertToString(object value) { string convertedValue; if (value is string) convertedValue = (string) value; else if (value is DateTime) convertedValue = ((DateTime) value).ToString(DateTimeFormatting); else { try { convertedValue = Convert.ToDecimal(value).ToString(NumericFormatting); } catch (Exception) { convertedValue = value.ToString(); } } return convertedValue; } protected override DocumentFragment GetResultFragment() { string value = null; if (Document != null && !string.IsNullOrEmpty(PropertyPath)) { var currentItem = Document.MailMergeDataSource.CurrentItem; if (currentItem != null) { value = ConvertToString(GetNestedPropertyValue(currentItem, PropertyPath)); } } return CreateFragmentFromText(value); } protected override void BuildCodeOverride() { CodeBuilder.SetFieldArgument(_propertyPath); } protected override DocumentFragment GetCodeFragment() { return CreateFragmentFromText(string.Format("{{{0} {1}}}", FieldType, DisplayName)); } protected override DocumentFragment GetDisplayNameFragment() { return CreateFragmentFromText(string.Format(DisplayNameFragmentFormat, DisplayName)); } private static object GetNestedPropertyValue(object value, string propertyPath) { if (value == null || string.IsNullOrEmpty(propertyPath)) return null; var currentType = value.GetType(); var path = propertyPath.Split('.'); foreach (var propertyStep in path) { var prop = currentType.GetProperty(propertyStep); if (prop == null || value == null) { value = "#{ERROR}#"; break; } value = prop.GetValue(value, null); currentType = prop.PropertyType; } return value; }}