2009-03-24 2 views
7

Comment effacer la sélection TreeView dans un TreeView WPF? J'ai essayé en boucle à travers le TreeNodes et en effaçant la propriété IsSelected, cependant c'est une propriété ReadOnly. Des idées?WPF TreeView Clear Selection

Le TreeView utilise la liaison XML via l'objet XMLDataProvider.

Répondre

8

Vous ne savez pas exactement ce que vous entendez par TreeNodes.

En général, vous aurait un IsSelected propriété correspondant sur votre modèle de vue que votre vue se lie à:

<TreeView> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="TreeViewItem"> 
      <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 

Par conséquent, vous simplement en boucle à travers les éléments de données dans votre modèle de vue et y mettre IsSelected = false.

Cependant, il semble que vous n'ayez pas cette propriété. Dans ce cas, vous devez obtenir le TreeViewItem correspondant pour chaque élément de données. Voir la propriété TreeView.ItemContainerGenerator pour savoir comment faire. Quelque chose comme:

var treeViewItem = _treeView.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem; 
treeViewItem.IsSelected = false; 
+1

Je cherche désespérément un moyen de sélectionner premier indice d'un TreeView. J'ai essayé la solution ci-dessus (ContainerFromIndex) mais elle renvoie null. Toute aide? – Shimmy

2

Trouver l'élément sélectionné et définissez la valeur:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    TreeViewItem tvi = treeviewExample.SelectedItem as TreeViewItem; 
    if (tvi != null) 
    { 
    tvi.IsSelected = false; 
    } 
} 
10

je suis tombé sur exactement les mêmes problèmes et a écrit le code suivant qui fonctionne sur tous les TreeView, avec une seule ligne appel à la première fonction.

class TomWrightsUtils 
{ 
    public static void ClearTreeViewSelection(TreeView tv) 
    { 
     if (tv != null) 
      ClearTreeViewItemsControlSelection(tv.Items, tv.ItemContainerGenerator); 
    } 
    private static void ClearTreeViewItemsControlSelection(ItemCollection ic, ItemContainerGenerator icg) 
    { 
     if ((ic != null) && (icg != null)) 
      for (int i = 0; i < ic.Count; i++) 
      { 
       TreeViewItem tvi = icg.ContainerFromIndex(i) as TreeViewItem; 
       if (tvi != null) 
       { 
        ClearTreeViewItemsControlSelection(tvi.Items, tvi.ItemContainerGenerator); 
        tvi.IsSelected = false; 
       } 
      } 
    } 
} 
+1

Rien n'avait fonctionné jusqu'à présent. Parfait! Je vous remercie! – StinkyCat

0

Cela semble fonctionner jusqu'à présent, mais je l'ai juste mis comme il y a 5 minutes, donc utilisez à vos risques et périls. Je voulais essentiellement effacer la sélection lorsque l'utilisateur clique dans le contrôle de l'arborescence, mais pas sur un élément de l'arborescence.

void DestinationTree_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    TreeView tree = sender as TreeView; 
    DestinationClientViewModel selectedItem = tree.SelectedItem as DestinationClientViewModel; 

    if (selectedItem != null) 
    { 
     int selectedItemIndex = this.DestinationTree.Items.IndexOf(selectedItem); 

     if (selectedItemIndex > -1) 
     { 
      TreeViewItem tvi = this.DestinationTree.ItemContainerGenerator.ContainerFromIndex(selectedItemIndex) as TreeViewItem; 
      if (tvi != null) 
       tvi.IsSelected = false; 
     } 
    } 
} 
+0

Ignorer mon code. Ne fonctionne qu'au niveau racine. Les nœuds enfants sélectionnés ne seront pas effacés. –

2

Cela fonctionne très bien comme méthode extention de sorte que vous pouvez appeler

youTreeview.ClearSelection(); 

using System.Windows.Forms; 
using System.Windows.Controls; 

namespace YourAppNamespace 
{ 
    public static void ClearSelection(this TreeView input) 
    { 
    // this should be some container that you put in 
    // possibly the actual treeviewitem, not sure on that though 
    var selected = input.SelectedItem; 
    if (selected == null) 
     return; 

    // in my case this works perfectly 
    var tvi = input.ItemContainerGenerator.ContainerFromItem(selected) as TreeViewItem; 
    var tvi = input.ItemContainerGenerator.ContainerFromItem(selected) as TreeViewItem; 
    if (tvi == null) 
    { 
     // it must be a child, heres a hack fix 
     // my nodes are inherited from TreeViewItemViewModel by Josh Smith 
     var child = selected as WPF.Controls.TreeViewItemViewModel; 
     if (child == null) 
      return; 
     child.IsSelected = false; 

    } 
    else 
     tvi.IsSelected = false; 
    } 


} 
1

Il a été mon expérience de rester loin de la norme exige ItemContainerGenerator parce qu'ils échouent sur les noeuds à une profondeur supérieure à n +1 J'utilise la combinaison des méthodes d'extension suivantes ci-dessous. Les méthodes d'extension ContainerFromItem proviennent d'un blog MSDN et cela a fait des merveilles pour moi quand j'ai eu affaire à TreeView.

public static void ClearSelection(this TreeView input) 
    { 
    var selected = input.SelectedItem; 

    if (selected == null) return; 

    var tvi = input.ContainerFromItem(selected) as TreeViewItem; 

    if (tvi == null) return; 

    tvi.IsSelected = false; 

    } 

    public static TreeViewItem ContainerFromItem(this TreeView treeView, object item) 
    { 
    TreeViewItem containerThatMightContainItem = (TreeViewItem)treeView.ItemContainerGenerator.ContainerFromItem(item); 
    if (containerThatMightContainItem != null) 
     return containerThatMightContainItem; 
    else 
     return ContainerFromItem(treeView.ItemContainerGenerator, treeView.Items, item); 
    } 

    private static TreeViewItem ContainerFromItem(ItemContainerGenerator parentItemContainerGenerator, ItemCollection itemCollection, object item) 
    { 
    foreach (object curChildItem in itemCollection) 
    { 
     TreeViewItem parentContainer = (TreeViewItem)parentItemContainerGenerator.ContainerFromItem(curChildItem); 
     if (parentContainer == null) 
      return null; 
     TreeViewItem containerThatMightContainItem = (TreeViewItem)parentContainer.ItemContainerGenerator.ContainerFromItem(item); 
     if (containerThatMightContainItem != null) 
      return containerThatMightContainItem; 
     TreeViewItem recursionResult = ContainerFromItem(parentContainer.ItemContainerGenerator, parentContainer.Items, item); 
     if (recursionResult != null) 
      return recursionResult; 
    } 
    return null; 
    } 
0

je courais dans cette situation moi-même avec une coutume arbre Liste mise en œuvre après avoir cherché pendant longtemps j'ai finalement trouvé une solution qui a fonctionné pour moi.

L'explication complète est disponible à http://social.msdn.microsoft.com/Forums/vstudio/en-US/36aca7f7-0b47-488b-8e16-840b86addfa3/getting-treeviewitem-for-the-selected-item-in-a-treeview

L'idée de base vous est capturer l'événement TreeViewItem.Selected et enregistrer la source de l'événement dans l'attribut Tag sur votre TreeView. Ensuite, lorsque vous devez l'effacer, vous pouvez accéder à l'attribut Tag sur votre contrôle et définir la valeur IsSelected sur False. Cela fonctionne pour moi avec 2 niveaux d'enfants imbriqués. J'espère que cela fonctionnera pour vous.

Pour des raisons de persistance:

déclaration TreeView

<TreeView Name="myTreeView" TreeViewItem.Selected="OnItemSelected" 
    ItemsSource="{Binding Source={StaticResource myHierarchicalData}}"/> 

gestionnaire d'événements

private void OnItemSelected(object sender, RoutedEventArgs e) 
{ 
    myTreeView.Tag = e.OriginalSource; 
} 

Logique Effacer la sélection

if (myTreeView.SelectedItem != null) 
{ 
    TreeViewItem selectedTVI = myTreeView.Tag as TreeViewItem; 
    // add your code here mine was selectedTVI.IsSelected = false; 
} 
0

Je viens suis tombé sur le même problème.

Une solution rapide et sale

tree.ItemsSource = null; 

tree.ItemsSource = yourSource; 
0
TreeViewItem tvi = tvMain.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem; 

if (tvi != null) { tvi.IsSelected = true; tvi.IsSelected = false; }