2009-03-24 30 views
7

Come si cancella la selezione TreeView in un TreeView WPF? Ho provato a scorrere il TreeNodes e a cancellare la proprietà IsSelected, tuttavia si tratta di una proprietà ReadOnly. Qualche idea?WPF TreeView Clear Selection

Il TreeView utilizza XML Binding tramite l'oggetto XMLDataProvider.

risposta

8

Non sono sicuro cosa intendi per TreeNodes.

In genere si avrebbe avuto un corrispondente IsSelected proprietà del modello di opinione che la vostra vista si lega a:

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

Pertanto, si sarebbe solo ciclo tra gli elementi di dati nel modello visualizzazione e impostare IsSelected = false lì.

Tuttavia, sembra che tu non abbia una tale proprietà. Stando così le cose, è necessario ottenere il corrispondente TreeViewItem per ogni elemento di dati. Vedere la proprietà TreeView.ItemContainerGenerator per informazioni su come farlo. Qualcosa di simile:

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

Sto disperatamente cercando un modo per selezionare primo indice di un TreeView. Ho provato la soluzione dall'alto (ContainerFromIndex) ma restituisce null. Qualche aiuto? – Shimmy

2

Trova l'elemento selezionato e impostare il valore:

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

mi sono imbattuto esatto gli stessi problemi e ha scritto il seguente codice che funziona su qualsiasi visualizzazione struttura, con solo una singola linea chiama alla prima funzione.

+1

Niente ha funzionato fino a questo. Perfezionare! Grazie! – StinkyCat

0

Sembra funzionare finora, ma l'ho inserito solo 5 minuti fa, quindi utilizzalo a tuo rischio. Fondamentalmente volevo cancellare la selezione quando l'utente fa clic all'interno del controllo ad albero, ma non su un elemento ad albero.

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

Ignora il mio codice. Funziona solo a livello di root. Qualsiasi nodo figlio selezionato non verrà cancellato. –

2

questo funziona grande come un metodo di estensione in modo da poter chiamare

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

E 'stata la mia esperienza di stare lontano dallo standard ItemContainerGenerator chiama perché verranno a mancare sui nodi ad una profondità maggiore di n +1. Io uso la combinazione dei seguenti metodi di estensione qui sotto. I metodi di estensione ContainerFromItem provengono da un blog MSDN e ha funzionato a meraviglia per me quando si ha a che fare con 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

stavo correndo in questa situazione me stesso con un costume implementazione elenco Tree View dopo aver guardato per molto tempo ho finalmente trovato una soluzione che ha funzionato per me.

La spiegazione completa può essere trovato alla http://social.msdn.microsoft.com/Forums/vstudio/en-US/36aca7f7-0b47-488b-8e16-840b86addfa3/getting-treeviewitem-for-the-selected-item-in-a-treeview

L'idea di base è di catturare l'evento TreeViewItem.Selected e salvare l'origine dell'evento nell'attributo Tag sul TreeView. Quindi, quando è necessario cancellarlo, è possibile accedere all'attributo Tag sul proprio controllo e impostare il valore IsSelected su False. Questo funziona per me con 2 livelli di bambini nidificati. Spero che funzionerà per te.

Per l'amor di persistenza:

dichiarazione TreeView

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

Event Handler

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

logica di selezione trasparente

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

Ho appena incontrato lo stesso problema.

Una soluzione rapida e sporca

tree.ItemsSource = null; 

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

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