private void OnItemAdded(ThemeEditorTreeViewItem item)
        {
            var disposables = new CompositeDisposable();

            // Observe item name.
            var theme = _palette.Themes[item.ThemeId];

            item.Name.Skip(1).Subscribe(x =>
            {
                var oldValue = theme.Name.Value;
                _editService.Edit($"Set {typeof(T).Name} Theme Name {theme.Id}",
                                  () => theme.Name.Value = x,
                                  () => theme.Name.Value = oldValue,
                                  markAsIdOrNameDirty: true);
            }).DisposeWith(disposables);

            // Observe IsActive property.
            item.IsActive.Skip(1).Subscribe(x =>
            {
                if (!x)
                {
                    return;
                }

                var oldActiveTheme = _palette.ActiveTheme.Value;
                _editService.Edit($"Set {typeof(T).Name} Active Theme {item.ThemeId}",
                                  () => _palette.SetActiveTheme(item.ThemeId),
                                  () => _palette.SetActiveTheme(oldActiveTheme.Id));
            }).DisposeWith(disposables);

            _perItemDisposables.Add(item.id, disposables);
        }
        private void ItemIndexChanged(ThemeEditorTreeViewItem item, int index)
        {
            var oldIndex = _palette.GetThemeOrder(item.ThemeId);

            _editService.Edit($"Change {typeof(T).Name} Theme Index {item.ThemeId}",
                              () => _palette.SetThemeOrder(item.ThemeId, index),
                              () =>
            {
                _palette.SetThemeOrder(item.ThemeId, oldIndex);
                _view.TreeView.SetItemIndex(item, oldIndex, false);
                _view.TreeView.Reload();
            },
                              markAsIdOrNameDirty: true);
        }