public void propagateToBackingMatchers(MatcherChain matcherChain)
        {
            if (matcherVMRemoved != null)
            {
                matcherVMRemoved.propagateToBackingMatchers(matcherChain.Matchers, this);
                matcherVMRemoved = null;
            }
            MatcherVM.propagateToBackingMatchers(matcherChain.Matchers, this);
            if (MatcherVM.hasBackingMatcher())
            {
                MatcherVM.getBackingMatcher().Name = Name;
            }

            if (IsLevel && MatcherVM.hasBackingMatcher())
            {
                matcherChain.LevelMatcherRef = MatcherVM.getBackingMatcher();
            }
        }
        private void OnSelectedMatcherChanged(MatcherType newValue)
        {
            if (MatcherVM != null)
            {
                MatcherVM.remove();
                if (MatcherVM.hasBackingMatcher())
                {
                    matcherVMRemoved = MatcherVM;
                }
            }
            MatcherVM    = getInstance(newValue);
            HasAffixes   = MatcherVM.hasAffixes();
            HasSeparator = MatcherVM.hasSeparator();

            CanBeLevel = canBeLevel(newValue);
            if (!CanBeLevel)
            {
                IsLevel = false;
            }
        }