public void SetReplyMessage(MessageElementModel messageElementModel)
        {
            // Ensure to be on Main UI Thread
            if (!MainThread.IsMainThread)
            {
                MainThread.BeginInvokeOnMainThread(() => SetReplyMessage(messageElementModel));
                return;
            }

            // We can't add attachments
            FrameBeforeButtonAttachment.IsVisible = false;
            ButtonAttachment.IsVisible            = false;

            replyToMessageId = messageElementModel?.Reply?.Id;

            MessageContentReply.SetUsageMode(true);
            MessageContentReply.BindingContext = messageElementModel;

            MessageContentReplyElement.IsVisible = true;
        }
        protected override void OnBindingContextChanged()
        {
            if ((BindingContext != null) && (message == null))
            {
                message = (MessageElementModel)BindingContext;
                if (message != null)
                {
                    // Add Urgency element ?
                    if (message.Content.Urgency != UrgencyType.Std)
                    {
                        if (messageContentUrgency == null)
                        {
                            messageContentUrgency = new MessageContentUrgency();
                            messageContentUrgency.BindingContext = message;
                            ContentGrid.Children.Add(messageContentUrgency, 0, 0);
                            Grid.SetColumnSpan(messageContentUrgency, 2);
                        }
                    }

                    // Add forward header
                    if (message.IsForwarded)
                    {
                        if (messageContentForward == null)
                        {
                            messageContentForward = new MessageContentForward();
                            messageContentForward.BindingContext = message;
                            ContentGrid.Children.Add(messageContentForward, 0, 0);
                            Grid.SetColumnSpan(messageContentForward, 2);
                        }
                    }

                    // Add Reply element ?
                    if (message.Reply != null)
                    {
                        if (messageContentReply == null)
                        {
                            messageContentReply = new MessageContentReply();
                            messageContentReply.BindingContext = message;
                            ContentGrid.Children.Add(messageContentReply, 0, 1);
                            Grid.SetColumnSpan(messageContentReply, 2);
                        }
                    }

                    // Add Body element ?
                    if (!String.IsNullOrEmpty(message.Content?.Body))
                    {
                        if (message.Content.Body.StartsWith("/img", StringComparison.InvariantCultureIgnoreCase))
                        {
                            if (messageContentBodyWithImg == null)
                            {
                                messageContentBodyWithImg = new MessageContentBodyWithImg();
                                messageContentBodyWithImg.BindingContext = message;
                                ContentGrid.Children.Add(messageContentBodyWithImg, 0, 2);
                            }
                        }
                        else if (message.Content.Body.StartsWith("/code", StringComparison.InvariantCultureIgnoreCase))
                        {
                            if (messageContentBodyWithCode == null)
                            {
                                messageContentBodyWithCode = new MessageContentBodyWithCode();
                                messageContentBodyWithCode.BindingContext = message;
                                ContentGrid.Children.Add(messageContentBodyWithCode, 0, 2);
                            }
                        }
                        else if (messageContentBody == null)
                        {
                            messageContentBody = new MessageContentBody();
                            messageContentBody.BindingContext = message;
                            ContentGrid.Children.Add(messageContentBody, 0, 2);
                        }

                        BtnPosition = 2;
                    }
                    else if (message.Content.Type == "deletedMessage")
                    {
                        // We don't need action button in this case
                        needActionButton = false;

                        // Create MessageContentDeleted
                        messageContentDeleted = new MessageContentDeleted();
                        messageContentDeleted.BindingContext = message;
                        ContentGrid.Children.Add(messageContentDeleted, 0, 2);
                        Grid.SetColumnSpan(messageContentDeleted, 2);
                    }

                    // Add Attachment element ?
                    if (message.Content.Attachment != null)
                    {
                        if (messageContentAttachment == null)
                        {
                            messageContentAttachment = new MessageContentAttachment();
                            messageContentAttachment.BindingContext = message;
                            ContentGrid.Children.Add(messageContentAttachment, 0, 3);

                            if (BtnPosition == -1)
                            {
                                BtnPosition = 3;
                            }
                            else
                            {
                                Grid.SetColumnSpan(messageContentAttachment, 2);
                            }
                        }
                    }

                    // Are we managing a msg of the current user ?
                    if (message.Peer.Id == Helper.SdkWrapper.GetCurrentContactId())
                    {
                        color           = Helper.GetResourceDictionaryById <Color>("ColorConversationStreamMessageCurrentUserFont");
                        backgroundColor = Helper.GetResourceDictionaryById <Color>("ColorConversationStreamMessageCurrentUserBackGround");
                    }
                    else
                    {
                        color           = Helper.GetResourceDictionaryById <Color>("ColorConversationStreamMessageOtherUserFont");
                        backgroundColor = Helper.GetResourceDictionaryById <Color>("ColorConversationStreamMessageOtherUserBackGround");
                    }
                    interpolateColor = ColorInterpolator.InterpolateBetween(color, backgroundColor, 0.5);


                    Frame.BackgroundColor = backgroundColor;

                    // Add Btn Action in the correct place
                    if (needActionButton && (BtnPosition != -1))
                    {
                        CreateBtnAction();

                        BtnAction.ImageSourceId              = null;
                        BtnAction.BackgroundColor            = backgroundColor;
                        BtnAction.BackgroundColorOnMouseOver = interpolateColor;

                        ContentGrid.Children.Add(BtnAction, 1, BtnPosition);
                    }
                }
            }
        }