Search code examples
wpfxamlstylesscrollviewerexpander

How to use the IsEnabled to disable the parts of an Expander, but not the whole thing?


I have an expander with a custom template:

<ControlTemplate TargetType="{x:Type Expander}">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Border Grid.Row="0">
            <DockPanel>
                <ToggleButton DockPanel.Dock="Right" Template="{DynamicResource ExpanderToggle}" />
                <ContentPresenter DockPanel.Dock="Right" ContentSource="Tag" />
                <ContentPresenter DockPanel.Dock="Left" ContentSource="Header">
            </DockPanel>
        </Border>
        <Border Visibility="Collapsed" Grid.Row="1">
            <ScrollViewer IsEnabled="True">
                <ContentPresenter IsEnabled="{TemplateBinding IsEnabled}" />
            </ScrollViewer>
        </Border>
    </Grid>
</ControlTemplate>

Basically, I'm attempting to make it so that if I set the IsEnabled property to false my scrollviewer still can scroll (it stays enabled, but other parts of my control disable). Any way to do that?


Solution

  • If Robert's answer doesn't work, you could always create an AttachedProperty called IsContentEnabled and bind your ContentPresenter's IsEnabled to that property.

    <Expander local:IsContentEnabled="False" />
    
    <ControlTemplate TargetType="{x:Type Expander}">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Border Grid.Row="0">
                <DockPanel>
                    <ToggleButton DockPanel.Dock="Right" Template="{DynamicResource ExpanderToggle}" />
                    <ContentPresenter DockPanel.Dock="Right" ContentSource="Tag" />
                    <ContentPresenter DockPanel.Dock="Left" ContentSource="Header">
                </DockPanel>
            </Border>
            <Border Visibility="Collapsed" Grid.Row="1">
                <ScrollViewer>
                    <ContentPresenter IsEnabled="{TemplateBinding local:IsContentEnabled}" />
                </ScrollViewer>
            </Border>
        </Grid>
    </ControlTemplate>