2011-02-01 2 views
8

У меня есть wpf TreeView - привязаны к некоторым данным. Treeview находится слева от окна, разделенного на две области, где дерево является навигацией, а панель с правой стороны изменяет содержимое в зависимости от выбранного узла дерева.Как предотвратить выбор TreeViewItem на основе условия

Не все узлы дерева имеют подробную информацию. Я хочу отключить выбор этих узлов. Есть идеи?

Благодаря

+2

Почему бы не просто показать сообщение «Сведения не доступны» при выборе этих узлов? Если они не поддаются выбору, это не очень соответствует функциональности TreeView. Если пользователь нажимает на узел и этот узел не выбирается, его первая идея будет заключаться в том, что щелчок был потерян (нет визуальной обратной связи его действия). Не говоря уже о том, как проще реализовать. –

ответ

6

У вас есть что-то вроде Логическое свойство в источнике называется HasDetails или что-то? В этом случае вы можете использовать что-то вроде этого. Создайте MultiDataTrigger в ItemContainerStyle, который связывается с HasDetails в DataContext и IsSelected для TreeViewItem, и если оба значения True (ну, True, что HasDetails False :-), вы запускаете раскадровку, которая «отменяет» выбранный TreeViewItem.

Это отключит выбор для всех TreeViewItem, у которого нет деталей, но они по-прежнему будут расширяемы. Надеюсь, что это то, что вы искали

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

Update

Чтобы отключить TreeViewItem «S, где HasDetails ложна вы можете использовать этот

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

спасибо Meleak. Он работает очень хорошо, однако я теряю выделение выделения последнего узла. Есть идеи? – jama64

+0

@ jama64: Вы имеете в виду, что вы можете выбрать его, но он не выделяет (меняет цвет)? В этом случае я не могу воспроизвести его –

+0

Нет, он не будет выбирать по мере необходимости, но все дерево теряет выделение выделения. Например, если один из выбираемых узлов активен, и мы пытаемся выбрать один из невыбранных узлов, невыбранный узел не будет выбран, но тогда дерево потеряет выделение выделения. – jama64

18

@ jama64: Вы можете добиться того, что вы хотите, если вы измените стиль из свойства IsEnabled в Focusable.

<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="Focusable" Value="{Binding HasDetails}"/> 
    </Style> 
</TreeView.ItemContainerStyle> 
Смежные вопросы