|
if ((item as ITextMessage).Text == "How would you rate your interaction with our travel bot?")
{
return ratingDataTemplate;
}
else
{
return incomingDataTemplate;
}
[C#]
… this.sfChat.MessageTemplate = new ChatDataTemplateSelector(this.sfChat); … internal class ChatDataTemplateSelector : DataTemplateSelector
{
#region Fields
/// <summary>
/// An instance of the <see cref="SfChat"/> control.
/// </summary>
private SfChat chat;
#endregion
#region Constructor
/// <summary>
/// Initializes a new instance of the <see cref="ChatDataTemplateSelector"/> class.
/// </summary>
/// <param name="chat">The instance of the SfChat control.</param>
public ChatDataTemplateSelector(SfChat chat)
{
this.chat = chat;
this.OutgoingTextMessageTemplate = new DataTemplate(typeof(OutgoingMessageTemplate));
var chatListView = chat.GetType().GetRuntimeProperties().FirstOrDefault(x => x.Name.Equals("ChatListView")).GetValue(chat);
var sfItemTemplate = chatListView.GetType().GetRuntimeProperties().FirstOrDefault(x => x.Name.Equals("ItemTemplate")).GetValue(chatListView);
var outgoingTemplate= (DataTemplate) sfItemTemplate.GetType().GetRuntimeProperties().FirstOrDefault(x => x.Name.Equals("OutgoingTextMessageTemplate")).GetValue(sfItemTemplate);
this.OutgoingTextMessageTemplate = outgoingTemplate;
this.CalendarMessageTemplate = new DataTemplate(typeof(CalendarMessageTemplate));
var calendarMessageTemplate = (DataTemplate)sfItemTemplate.GetType().GetRuntimeProperties().FirstOrDefault(x => x.Name.Equals("CalendarMessageTemplate")).GetValue(sfItemTemplate);
this.CalendarMessageTemplate = calendarMessageTemplate;
this.DateTimeMessageTemplate = new DataTemplate(typeof(DateTimeMessageTemplate));
var dateMessageTemplate = (DataTemplate)sfItemTemplate.GetType().GetRuntimeProperties().FirstOrDefault(x => x.Name.Equals("DateTimeMessageTemplate")).GetValue(sfItemTemplate);
this.DateTimeMessageTemplate = dateMessageTemplate;
this.TextMessageTemplate = new DataTemplate(typeof(BaseMessageTemplate));
var textMessageTemplate = (DataTemplate)sfItemTemplate.GetType().GetRuntimeProperties().FirstOrDefault(x => x.Name.Equals("TextMessageTemplate")).GetValue(sfItemTemplate);
this.TextMessageTemplate = textMessageTemplate;
this.TimePickerMessageTemplate = new DataTemplate(typeof(TimePickerMessageTemplate));
var timePickerMessageTemplate = (DataTemplate)sfItemTemplate.GetType().GetRuntimeProperties().FirstOrDefault(x => x.Name.Equals("TimePickerMessageTemplate")).GetValue(sfItemTemplate);
this.TextMessageTemplate = timePickerMessageTemplate;
this.HyperlinkMessageTemplate = new DataTemplate(typeof(HyperlinkMessageTemplate));
var hyperlinkMessageTemplate = (DataTemplate)sfItemTemplate.GetType().GetRuntimeProperties().FirstOrDefault(x => x.Name.Equals("HyperlinkMessageTemplate")).GetValue(sfItemTemplate);
this.HyperlinkMessageTemplate = hyperlinkMessageTemplate;
}
#endregion
#region private property
/// <summary>
/// Gets or sets a message template for outgoing message.
/// </summary>
private DataTemplate OutgoingTextMessageTemplate { get; set; }
/// <summary>
/// Gets or sets a message template for calendar message.
/// </summary>
private DataTemplate CalendarMessageTemplate { get; set; }
/// <summary>
/// Gets or sets a message template for DateTime message.
/// </summary>
private DataTemplate DateTimeMessageTemplate { get; set; }
/// <summary>
/// Gets or sets a message template for text message.
/// </summary>
private DataTemplate TextMessageTemplate { get; set; }
/// <summary>
/// Gets or sets a message template for time picker message.
/// </summary>
private DataTemplate TimePickerMessageTemplate { get; set; }
/// <summary>
/// Gets or sets a message template for hyperlink message.
/// </summary>
private DataTemplate HyperlinkMessageTemplate { get; set; }
#endregion
#region Selector
/// <summary>
/// Returns the required template based on the message type.
/// </summary>
/// <param name="item">The actual message as <see cref="object"/>.</param>
/// <param name="container">The actual row data as <see cref="BindableObject"/>.</param>
/// <returns>The desired <see cref="DataTemplate"/>.</returns>
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
if (item == null)
{
return null;
}
// Returns the actual template based on the message type.
if (item as ICalendarMessage != null)
{
return this.CalendarMessageTemplate;
}
else if (item as IDatePickerMessage != null)
{
return this.DateTimeMessageTemplate;
}
else if (item as ITimePickerMessage != null)
{
return this.TimePickerMessageTemplate;
}
else if (item as IHyperlinkMessage != null)
{
return this.HyperlinkMessageTemplate;
}
else if (item as ITextMessage != null)
{
var message = item as ITextMessage;
if (message.Author == this.chat.CurrentUser)
{
return this.OutgoingTextMessageTemplate;
}
else
{
return this.TextMessageTemplate;
}
}
return new DataTemplate(() =>
{
return item;
});
}
#endregion
} |