Как предотвратить выбор TreeViewItem на основе условия - PullRequest
9 голосов
/ 02 февраля 2011

У меня есть wpf TreeView - привязан к некоторым данным.Древовидное представление находится слева от окна, разделенного на две области, где дерево является навигацией, а панель справа изменяет содержимое в зависимости от выбранного узла дерева.детальная информация.Я хочу отключить выбор этих узлов.Есть идеи?

Спасибо

Ответы [ 2 ]

19 голосов
/ 25 июля 2011

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

<TreeView.ItemContainerStyle>
     <Style TargetType="{x:Type TreeViewItem}">
         <Setter Property="Focusable" Value="{Binding HasDetails}"/>
     </Style>
</TreeView.ItemContainerStyle>
5 голосов
/ 02 февраля 2011

Есть ли в вашем источнике что-то вроде логического свойства с именем 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>

Обновление

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

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