public CsvTextEditorControl()
        {
#pragma warning disable IDISP001 // Dispose created
            var serviceLocator = this.GetServiceLocator();
#pragma warning restore IDISP001 // Dispose created
            _typeFactory = serviceLocator.ResolveType <ITypeFactory>();

            _synchronizationService = _typeFactory.CreateInstanceWithParametersAndAutoCompletion <CsvTextSynchronizationService>();
            serviceLocator.RegisterInstance(_synchronizationService, this);

            CreateRoutedCommandBinding(Paste, () => CsvTextEditorInstance?.Paste());
            CreateRoutedCommandBinding(Cut, () => CsvTextEditorInstance?.Cut());
            CreateRoutedCommandBinding(Copy, () => CsvTextEditorInstance?.Copy());

            CreateRoutedCommandBinding(GotoNextColumn, () => CsvTextEditorInstance?.ExecuteOperation <GotoNextColumnOperation>());
            CreateRoutedCommandBinding(GotoPreviousColumn, () => CsvTextEditorInstance?.ExecuteOperation <GotoPreviousColumnOperation>());

            CreateRoutedCommandBinding(Undo, () => CsvTextEditorInstance?.Undo(), () => CsvTextEditorInstance?.CanUndo == true);
            CreateRoutedCommandBinding(Redo, () => CsvTextEditorInstance?.Redo(), () => CsvTextEditorInstance?.CanRedo == true);

            CreateRoutedCommandBinding(AddLine, () => CsvTextEditorInstance?.ExecuteOperation <AddLineOperation>());
            CreateRoutedCommandBinding(RemoveLine, () => CsvTextEditorInstance?.ExecuteOperation <RemoveLineOperation>());
            CreateRoutedCommandBinding(DuplicateLine, () => CsvTextEditorInstance?.ExecuteOperation <DuplicateLineOperation>());
            CreateRoutedCommandBinding(RemoveColumn, () => CsvTextEditorInstance?.ExecuteOperation <RemoveColumnOperation>());
            CreateRoutedCommandBinding(AddColumn, () => CsvTextEditorInstance?.ExecuteOperation <AddColumnOperation>());
            CreateRoutedCommandBinding(QuoteColumn, () => CsvTextEditorInstance?.ExecuteOperation <QuoteColumnOperation>());

            CreateRoutedCommandBinding(DeleteNextSelectedText, () => CsvTextEditorInstance?.DeleteNextSelectedText());
            CreateRoutedCommandBinding(DeletePreviousSelectedText, () => CsvTextEditorInstance?.DeletePreviousSelectedText());
        }
        private void OnTextEditorControlPropertyChanged(object sender, PropertyChangedEventArgs args)
        {
            var textEditorControl = AssociatedObject;

            if (args.PropertyName != nameof(textEditorControl.Scope))
            {
                return;
            }

            var serviceLocator = this.GetServiceLocator();
            var scope          = textEditorControl.Scope;

            _csvTextSynchronizationService = serviceLocator.ResolveType <ICsvTextSynchronizationService>(scope);
        }
        protected override void OnAssociatedObjectUnloaded()
        {
            var textEditorControl = AssociatedObject;

            _csvTextSynchronizationService     = null;
            textEditorControl.PropertyChanged -= OnTextEditorControlPropertyChanged;

            var textEditor = AssociatedObject?.TextEditor;

            if (textEditor == null)
            {
                return;
            }

            textEditor.TextChanged -= OnTextChanged;

            base.OnAssociatedObjectUnloaded();
        }
        private void OnScopeChanged()
        {
            var scope = Scope;

            if (scope == null)
            {
                _csvTextEditorService          = null;
                _csvTextSynchronizationService = null;

                return;
            }

            if (_csvTextEditorService == null && _serviceLocator.IsTypeRegistered <ICsvTextEditorService>(scope))
            {
                _csvTextEditorService = _serviceLocator.ResolveType <ICsvTextEditorService>(scope);
            }

            if (_csvTextSynchronizationService == null && _serviceLocator.IsTypeRegistered <ICsvTextSynchronizationService>(scope))
            {
                _csvTextSynchronizationService = _serviceLocator.ResolveType <ICsvTextSynchronizationService>(scope);
            }

            UpdateInitialization();
        }