2011-05-24 112 views
4

我在WPF中使用树视图,并且我不想在重新加载绑定集合时松开状态(展开和聚焦)。WPF Treeview只展开第一个节点和选定的项目?

在第一负载可以很容易地扩展仅仅是第一点,我用下面的代码:

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集合。我有绑定和使用视图模型不同的对象类型将是不好受...... IMO :)

非常感谢

+0

我真的不明白你的意思是“重新加载项目集合” – Cilvic

回答

7

我必须结合和使用视图模型将是不好受不同的对象类型... IMO

事实上,你现在所遇到的问题表明正是为什么使用视图模型是太痛苦了。

如果构建视图模型,则可以在视图模型类中实现IsSelectedIsExpanded属性。然后,您可以将它们的相关属性TreeViewItem绑定到它们。一旦你这样做,UI中状态的改变将反映在视图模型数据中,并且如果你从数据重新加载UI,状态的改变将被保留。

这是实现你想要实现的最简单的方法。作为一个额外的好处,你可以放弃上面发布的背后的所有难以测试的代码。