예제 #1
0
        /// <summary>
        /// Создает тег.
        /// </summary>
        private TagViewModel CreateTag(object content = null)
        {
            Contract.Requires(content == null || content is string || content is ConfWithHio || content is IHrItemObject);

            TagViewModel tag;
            var          itemObject = content as IHrItemObject;
            var          chio       = content as ConfWithHio;
            var          str        = content as string;

            if (itemObject != null)
            {
                tag = new TagViewModel(this, itemObject);
            }
            else if (chio != null)
            {
                tag            = new TagViewModel(this, chio.HIO);
                tag.Confidence = chio.Confidence;
            }
            else if (str != null)
            {
                tag = new TagViewModel(this, str);
            }
            else
            {
                tag = new TagViewModel(this);
            }

            tag.Deleted += (s, e) =>
            {
                Contract.Requires(!tag.IsLast);
                tagsWritable.Remove(tag);
                StartEdit(LastTag);
            };
            tag.Converting      += CompleteOnConvert;
            tag.PropertyChanged += (s, e) =>
            {
                if (e.PropertyName == "Query")
                {
                    if (EditingTag == null) // non user change
                    {
                        return;
                    }
                    MakeSuggestions(EditingTag);
                    RefreshPopup();
                    OnPropertyChanged(() => IsEmpty);
                }
                else if (e.PropertyName == "IsTextBoxFocused")
                {
                    if (tag.IsTextBoxFocused)
                    {
                        if (tag.Signalization == null || tag.Signalization == Signalizations.None)
                        {
                            Suggestions.Clear();
                        }
                        else
                        {
                            MakeSuggestions(SelectedTag); // предположения для тегов с сигнализацией
                        }

                        CanCompleteOnLostFocus = true;

                        SelectedTags.Except(tag.ToEnumerable()).ForAll(t => t.IsSelected = false);
                        SelectedTag = tag;
                    }
                    else
                    {
                        // выход из редактирования
                        Suggestions.Clear();

                        // потерялся фокус после перехода не в предположения → завершение введенного текста
                        if (CanCompleteOnLostFocus)
                        {
                            CompleteOnLostFocus(tag);
                        }
                    }

                    RefreshPopup();
                }
                else if (e.PropertyName == "State")
                {
                    if (tag.State == State.Completed)
                    {
                        OnTagCompleted(tag);
                        OnEntitiesChanged();
                    }
                }
            };
            return(tag);
        }