2011-02-01 10 views
8

Ho wpf TreeView - associato ad alcuni dati. La visualizzazione degli alberi si trova nella parte sinistra di una finestra divisa in due aree in cui l'albero è la navigazione e un riquadro nella parte destra modifica il contenuto in base al nodo dell'albero selezionato.Come impedire la selezione di un TreeViewItem in base a una condizione

Non tutti i nodi della vista albero producono informazioni dettagliate. Voglio disabilitare la selezione di quei nodi. Qualche idea?

Grazie

+2

Perché non mostrare un messaggio come "Nessun dettaglio disponibile" quando si selezionano questi nodi? Rendendoli non selezionabili non è molto coerente con la funzionalità di un TreeView. Se un utente fa clic su un nodo e quel nodo non viene selezionato, la sua prima idea sarà che il clic è stato perso (nessun riscontro visivo della sua azione). Per non parlare è molto più facile da implementare. –

risposta

6

Avete qualcosa di simile a una proprietà booleana nell'origine chiamato HasDetails o qualcosa del genere? In tal caso puoi usare qualcosa di simile. Crea un MultiDataTrigger nel ItemContainerStyle che si collega a DataContext e IsSelected per il TreeViewItem e se entrambi sono True (beh, Vero che HasDetails è Falso :-), si avvia uno Storyboard che "deseleziona" il nuovo selezionato TreeViewItem.

Disabilita la selezione per tutti gli TreeViewItem che non dispongono di dettagli ma saranno comunque espandibili. Speriamo che questo era quello che stavi cercando

<TreeView ...> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding HasDetails}" Value="False"/> 
         <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True"/> 
        </MultiDataTrigger.Conditions> 
        <MultiDataTrigger.EnterActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <BooleanAnimationUsingKeyFrames BeginTime="00:00:00" 
                   Storyboard.TargetProperty="(TreeViewItem.IsSelected)"> 
            <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False"/> 
           </BooleanAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
        </MultiDataTrigger.EnterActions> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 

Aggiornamento

Per disabilitare i TreeViewItem 's dove HasDetails è falso è possibile utilizzare questo

<TreeView ...> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsEnabled" Value="{Binding HasDetails}"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 
+0

grazie Meleak. Funziona molto bene, tuttavia sto perdendo l'evidenziazione di selezione dell'ultimo nodo. Qualche idea? – jama64

+0

@ jama64: Vuoi dire che sei in grado di selezionarlo ma non evidenzia (cambia colore)? In tal caso, non sono in grado di riprodurlo –

+0

No, non verrà selezionato come richiesto ma l'intero albero perde la selezione. Ad esempio, se uno dei nodi selezionabili è attivo e proviamo a selezionare uno dei nodi non selezionabili, il nodo non selezionabile non verrà selezionato, ma l'albero perde l'evidenziazione della selezione. – jama64

18

@ jama64: È possibile ottenere ciò che vuoi se cambi lo stile da Property IsEnabled a Focusable.

<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="Focusable" Value="{Binding HasDetails}"/> 
    </Style> 
</TreeView.ItemContainerStyle>