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<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;
    }
我的问题是,当我重新加载项目集合时,焦点丢失了(选定项目),展开的项目折叠了。如何分隔绑定项和ui? 最后一点,我想以编程方式设置所选项目。依赖项属性更改后,如何重新加载所选项目? 我已经查看过乔什·史密斯解决方案(http://www.codeproject.com/KB/WPF/TreeViewWithviewmodel.aspx),但是我不想使用viewmodel集合进行绑定。我有不同的对象类型进行绑定,使用viewmodel会很痛苦... IMO :) 非常感谢     

解决方法

  我有不同的对象类型要绑定,使用ViewModel会很痛苦... IMO 实际上,您现在遇到的问题恰恰说明了为什么不使用视图模型太痛苦了。 如果构造视图模型,则可以在视图模型类中实现
IsSelected
IsExpanded
属性。然后可以将
TreeViewItem
的相关属性绑定到它们。完成此操作后,对UI中状态的更改将反映在视图模型数据中,并且如果您从数据中重新加载UI,则状态更改将被保留。 这是实现您要达到的目标的最简单的方法。另外一个好处是,您可以丢弃上面发布的神秘而难以测试的代码的所有最后一部分。