Hi
all,
I think i'm missing something obvious...
I want to have some friendly names on my mail merge fields. (namely
spaces in the field names)
So i have a class for instance
Public
Class
someclass
{
<DisplayName(
"This is the complex description of the field"
)>
Public
property thisfieldnamehasacomplexdescription as string
Public
property anothercomplexfield as string
}
This is the only way i know to get "Friendly" names in the dropdown
that is the mail merge.
So the two fields turn up okay as :
"This is the complex description of
the field"
"anothercomplexfield"
but only anothercomplexfield actually populates with data when you do the merge.
Am i going to have to template the raddropdownbutton that holds the mail merge
fields?
Is there an example of this somewhere?
Also a sub question. How do i add a scroll bar??
4 Answers, 1 is accepted
With the default MergeFields, it is not possible to change the display name fragment of the field in order to achieve a more friendly look. This should be possible if you implement a custom MergeField by deriving from the MergeField class. Here is a sample implementation that shows how this can be done:
public
class
CustomMergeField : MergeField
{
private
const
string
CustomFieldName =
"CustomField"
;
static
CustomMergeField()
{
CodeBasedFieldFactory.RegisterFieldType(CustomMergeField.CustomFieldName, () => {
return
new
CustomMergeField(); });
}
public
override
string
FieldTypeName
{
get
{
return
CustomMergeField.CustomFieldName;
}
}
public
override
Field CreateInstance()
{
return
new
CustomMergeField();
}
protected
override
DocumentFragment GetDisplayNameFragment()
{
return
base
.CreateFragmentFromText(
string
.Format(Field.DisplayNameFragmentFormat,
this
.GetFriendlyFieldName(
this
.PropertyPath)));
}
private
string
GetFriendlyFieldName(
string
fieldName)
{
int
lettersInEnglishAlphabet = 26;
List<
char
> separators =
new
List<
char
>(lettersInEnglishAlphabet);
for
(
int
i = 0; i < lettersInEnglishAlphabet; i++)
{
separators.Add((
char
)(
'A'
+ i));
}
StringBuilder newFieldName =
new
StringBuilder();
int
previousIndex = 0;
for
(
int
i = 1; i < fieldName.Length; i++)
{
if
(separators.Contains(fieldName[i]))
{
if
(previousIndex > 0)
{
newFieldName.Append(
" "
);
}
newFieldName.Append(fieldName.Substring(previousIndex, i - previousIndex));
previousIndex = i;
}
}
newFieldName.Append(
" "
+ fieldName.Substring(previousIndex));
return
newFieldName.ToString();
}
}
Note that the fragment that is shown when the DisplayMode is Code cannot be changed.
As for your other question, you can change the content of the dropdown button to show the friendly name of the fields and to include a scrollbar in the following way:
1. First, remove the binding of the button to the InsertMergeFieldEmptyCommand from XAML and give it a name (e.g. insertMergeField).
2. Next, add the following code in code-behind:
AddMergeFieldsInDropDownContent(
this
.insertMergeFieldButton);
private
void
AddMergeFieldsInDropDownContent(RadRibbonDropDownButton radRibbonDropDownButton)
{
Grid grid =
new
Grid();
grid.RowDefinitions.Add(
new
RowDefinition() { Height =
new
GridLength(100, GridUnitType.Pixel) });
ScrollViewer scrollViewer =
new
ScrollViewer();
scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
StackPanel stackPanel =
new
StackPanel();
foreach
(
string
fieldName
in
this
.editor.Document.MailMergeDataSource.GetColumnNames())
{
RadRibbonButton fieldButton =
new
RadRibbonButton()
{
Text =
this
.GetFriendlyFieldName(fieldName),
Size = ButtonSize.Medium,
HorizontalAlignment = HorizontalAlignment.Stretch,
HorizontalContentAlignment = HorizontalAlignment.Left
};
fieldButton.Command =
this
.editor.Commands.InsertFieldCommand;
fieldButton.CommandParameter =
new
MergeField() { PropertyPath = fieldName };
//or
//fieldButton.CommandParameter = new CustomMergeField() { PropertyPath = fieldName };
stackPanel.Children.Add(fieldButton);
}
stackPanel.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
scrollViewer.Content = stackPanel;
grid.Children.Add(scrollViewer);
radRibbonDropDownButton.DropDownContent = grid;
}
You can, of course optimize the code of the GetFriendlyName method and add it in a way that will be available by both classes.
I hope this helps. Greetings,
Iva Toteva
the Telerik team
Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get it now >>


I read your reply, but it would help if you could attach example to this thread, so instead of asking tons of questions we could figure it out from the working code.
Thanks!
Attached is the demo project you requested which uses the code from Iva's post. The demo also shows how you can wire a custom field to RadRichTextBox's predefined UI.
I hope you will find it useful.
Regards,
Petya
Telerik