Древовидное представление WPF Развернуть только первый узел и выбранный элемент?

Я использую древовидное представление в WPF, и я не хочу терять состояние (расширение и фокус) при перезагрузке связанной коллекции .

При первой загрузке легко развернуть только первый узел, я использую следующий код:

    private void ExpandFirstNodeTree()
    {
        foreach (var item in TreeviewModel.Items)
        {
            TreeViewItem itm = (TreeViewItem)TreeviewModel.ItemContainerGenerator.ContainerFromItem(item);
            if (itm == null) continue;
            itm.IsExpanded = true;
        }
    }

Я использую DependencyProprety для выбора элемента. Я исследую TreeView, нахожу TreeViewItem и устанавливаю для свойства элемента «IsSelected» значение true.

private static readonly DependencyProperty SelectedEntityCodeProperty =
        DependencyProperty.Register(PropertyHelper.GetName((EntitiesTreeview e) => e.SelectedEntityCode), typeof (string), typeof (EntitiesTreeview));

    public string SelectedEntityCode
    {
        get { return (string) GetValue(SelectedEntityCodeProperty); }
        set { SetValue(SelectedEntityCodeProperty, value); }
    }

    public EntitiesTreeview()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(EntitiesTreeview_Loaded);
    }

    private void LoadSelectedItem()
    {
        if ((!string.IsNullOrEmpty(SelectedEntityCode))
            && (TreeviewEntity.SelectedItem == null))
            ChangeSelectedItem(SelectedEntityCode, TreeviewEntity);
    }

    private bool ChangeSelectedItem(string entityCode, ItemsControl itemsControl) where T : ENTITYBASE
    {
        if (itemsControl != null)
        {
            foreach (var item in itemsControl.Items)
            {
                var currentContainer = itemsControl.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
                if ((currentContainer != null)
                    && (item is T)
                    && ((item as T).CCODE == entityCode))
                {
                    currentContainer.IsSelected = true;
                    var selectMethod = typeof (TreeViewItem).GetMethod("Select", BindingFlags.NonPublic | BindingFlags.Instance);
                    selectMethod.Invoke(currentContainer, new object[] {true});
                    return true;
                }
                if (ChangeSelectedItem(entityCode, currentContainer))
                    return true;
            }
        }
        return false;
    }

Моя проблема в том, что когда я перезагружаю коллекцию элементов, фокус теряется (выбранный элемент) и развернутые элементы сворачиваются. Как я могу разделить связанные элементы и пользовательский интерфейс? Наконец, я хочу программно установить выбранный элемент. Как я могу перезагрузить выбранный элемент при изменении свойства зависимости?

Я уже знаком с решением Джоша Смита ( http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx ), но я не хочу использовать коллекцию ViewModel для привязки. У меня есть другой тип объекта для привязки, и использовать ViewModel будет сложно ... IMO:)

Большое спасибо

5
задан rad 24 May 2011 в 17:56
поделиться