2011-02-01 16 views
8

Tengo wpf TreeView - limitado a algunos datos. El Treeview reside en la mano izquierda de una ventana dividida en dos áreas donde el árbol es la navegación y un panel en el lado derecho cambia de contenido dependiendo del nodo de árbol seleccionado.Cómo evitar la selección de un TreeViewItem basado en una condición

No todos los nodos de la vista en árbol producen información detallada. Quiero deshabilitar la selección de esos nodos. ¿Alguna idea?

Gracias

+2

¿Por qué no mostrar un mensaje como "No hay detalles disponibles" al seleccionar esos nodos? Hacerlos no seleccionables no es muy consistente con la funcionalidad de un TreeView. Si un usuario hace clic en un nodo y ese nodo no se selecciona, su primera idea será que el clic se perdió (sin comentarios visuales de su acción). Sin mencionar que es mucho más fácil de implementar. –

Respuesta

6

¿Tiene algo así como una propiedad booleana en su fuente de llama HasDetails o algo? En ese caso, puedes usar algo como esto. Cree un MultiDataTrigger en el ItemContainerStyle que enlaza a HasDetails en el DataContext y IsSelected para el TreeViewItem y si ambos son verdaderos (bueno, es cierto que HasDetails es falso :-), inicia un Storyboard que "anula la selección" del TreeViewItem recientemente seleccionado.

Esto deshabilitará la selección de todos los TreeViewItem que no tienen detalles pero que aún serán expandibles. Es de esperar que era lo que estaba buscando

<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> 

actualización

Para desactivar las TreeViewItem 's donde HasDetails es falso puede utilizar esta

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

gracias Meleak. Funciona muy bien, sin embargo, estoy perdiendo el resaltado de selección del último nodo. ¿Alguna idea? – jama64

+0

@ jama64: ¿Quiere decir que puede seleccionarlo pero no resalta (cambia de color)? En ese caso, no puedo reproducirlo –

+0

No, no seleccionará según se requiera pero el árbol entero pierde el resaltado de selección. Por ejemplo, si uno de los nodos seleccionables está activo e intentamos seleccionar uno de los nodos no seleccionables, el nodo no seleccionable no se seleccionará, pero luego el árbol perderá la selección resaltada. – jama64

18

@ jama64: Usted puede lograr lo lo desea si cambia el Estilo de la propiedad IsEnabled a Enfocable.

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