2011-05-24 145 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,狀態的改變將被保留。

這是實現你想要實現的最簡單的方法。作爲一個額外的好處,你可以放棄上面發佈的背後的所有難以測試的代碼。