private TokenItem CreateTokenItem(Token token)
        {
            object item = token.Item;

            var tokenItem = new TokenItem()
            {
                TokenKey = token.TokenKey,
                Content = item,
                ContentTemplate = TokenTemplate
            };

            if (TokenTemplate == null)
            {
                //if no template was supplied let's try to get a value from the object using the DisplayMemberPath
                if (!String.IsNullOrEmpty(DisplayMemberPath))
                {
                    var property = item.GetType().GetProperty(DisplayMemberPath);
                    if (property != null)
                    {
                        var value = property.GetValue(item, null);
                        if (value != null)
                            tokenItem.Content = value;
                    }
                }
            }

            return tokenItem;
        }
 private InlineUIContainer CreateTokenContainer(Token token)
 {
     return new InlineUIContainer(CreateTokenItem(token))
     {
         BaselineAlignment = BaselineAlignment.Center
     };
 }
        private Token ResolveTokenBySearchMemberPath(string searchText)
        {
            //create a new token and default the settings to the search text
            var token = new Token(TokenDelimiter)
            {
                TokenKey = searchText,
                Item = searchText
            };

            if (ItemsSource != null)
            {
                foreach (object item in ItemsSource)
                {
                    var searchProperty = item.GetType().GetProperty(SearchMemberPath);
                    if (searchProperty != null)
                    {
                        var searchValue = searchProperty.GetValue(item, null);
                        if (searchText.Equals(searchValue.ToString(), StringComparison.InvariantCultureIgnoreCase))
                        {
                            var valueProperty = item.GetType().GetProperty(ValueMemberPath);
                            if (valueProperty != null)
                                token.TokenKey = valueProperty.GetValue(item, null).ToString();

                            token.Item = item;
                            break;
                        }
                    }
                }
            }

            return token;
        }
        private void ReplaceTextWithToken(string inputText, Token token)
        {
            _surpressTextChangedEvent = true;

            var para = _rtb.CaretPosition.Paragraph;

            var matchedRun = para.Inlines.FirstOrDefault(inline =>
            {
                var run = inline as Run;
                return (run != null && run.Text.EndsWith(inputText));
            }) as Run;

            if (matchedRun != null) // Found a Run that matched the inputText
            {
                var tokenContainer = CreateTokenContainer(token);
                para.Inlines.InsertBefore(matchedRun, tokenContainer);

                // Remove only if the Text in the Run is the same as inputText, else split up
                if (matchedRun.Text == inputText)
                {
                    para.Inlines.Remove(matchedRun);
                }
                else // Split up
                {
                    var index = matchedRun.Text.IndexOf(inputText) + inputText.Length;
                    var tailEnd = new Run(matchedRun.Text.Substring(index));
                    para.Inlines.InsertAfter(matchedRun, tailEnd);
                    para.Inlines.Remove(matchedRun);
                }

                //now append the Text with the token key
                SetTextInternal(Text + token.TokenKey);
            }

            _surpressTextChangedEvent = false;
        }
 private void InitializeTokensFromText()
 {
     if (!String.IsNullOrEmpty(Text))
     {
         string[] tokenKeys = Text.Split(new string[] { TokenDelimiter }, StringSplitOptions.RemoveEmptyEntries);
         foreach (string tokenKey in tokenKeys)
         {
             var para = _rtb.CaretPosition.Paragraph;
             var token = new Token(TokenDelimiter)
             {
                 TokenKey = tokenKey,
                 Item = ResolveItemByTokenKey(tokenKey)
             };
             para.Inlines.Add(CreateTokenContainer(token));
         }
     }
 }