WPF Treeview Развернуть только первый узел и выбранный элемент? - PullRequest
5 голосов
/ 24 мая 2011

Я использую древовидное представление в 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<ENTITY>(SelectedEntityCode, TreeviewEntity);
    }

    private bool ChangeSelectedItem<T>(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<T>(entityCode, currentContainer))
                    return true;
            }
        }
        return false;
    }

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

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

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

1 Ответ

8 голосов
/ 25 мая 2011

У меня другой тип объекта для привязки, и использование ViewModel будет болезненным ... IMO

На самом деле, проблема, с которой вы столкнулись сейчас, демонстрирует, почему не использование модели представления слишком болезненно.

Если вы создаете модель представления, вы можете реализовать свойства IsSelected и IsExpanded в классе модели представления.Затем вы можете связать с ними соответствующие свойства TreeViewItem.После этого изменения состояния в пользовательском интерфейсе будут отражены в данных модели представления, и если вы перезагрузите пользовательский интерфейс из данных, изменения в состоянии будут сохранены.

Это наиболее простой вариантспособ достичь того, чего вы пытаетесь достичь.В качестве дополнительного преимущества вы можете отбросить каждый последний кусочек загадочно сложного для тестирования кода, который вы опубликовали выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...