MoonKnight
MoonKnight

Reputation: 23831

Optional Visibiltiy for Button in ControlTemplate

I have the following style for a Tabitem which contains a close button.

<Style x:Key="StudioTabItem" TargetType="{x:Type TabItem}">
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TabItem}">
                ...
                <Button Grid.Column="2" 
                        Width="15" 
                        Height="15" 
                        HorizontalAlignment="Center" 
                        VerticalAlignment="Center" 
                        Visibility={Binding}> 
                ...

I would like to make the visibility of the StudioTabItems button optional when I use the actual control. So something like

<TabControl x:Name="tabControl" 
            Style="{StaticResource StudioTabControl}"
            ItemsSource="{Binding Workspaces}" 
            SelectedIndex="{Binding SelectedIndex}"
            TabStripPlacement="Top" >
        <TabControl.ItemContainerStyle>
            <Style TargetType="TabItem" 
                   BasedOn="{StaticResource StudioTabItem}"
                   IsCloseButtonVisible="False"> <-- How to do this?

See the IsCloseButtonVisible on the last line of the above. I know this is likely to involve DependencyProperties. Is this possible and how can I achieve this?

Thanks for your time.

Upvotes: 1

Views: 35

Answers (1)

Nitin Purohit
Nitin Purohit

Reputation: 18578

This can be achieved by creating the Attached Property like below and by setting its property in style setter

    public static class TabItemBehaviour
    {
        public static readonly DependencyProperty IsCloseButtonVisibleProperty =
            DependencyProperty.RegisterAttached("IsCloseButtonVisible", typeof(bool), typeof(TabItemBehaviour), new UIPropertyMetadata(true, IsButtonVisiblePropertyChanged));

        public static bool GetIsCloseButtonVisible(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsCloseButtonVisibleProperty);
        }

        public static void SetIsCloseButtonVisible(DependencyObject obj, bool value)
        {
            obj.SetValue(IsCloseButtonVisibleProperty, value);
        }

        public static void IsButtonVisiblePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            TabItem item = o as TabItem;
            if (item != null)
            {
               Button closeButton = item.Template.FindName("CloseButton", item) as Button;
               if ((bool)e.NewValue == true)
               {
                   closeButton.Visibility = Visibility.Visible;
               }
               else
               {
                   closeButton.Visibility = Visibility.Collapsed;
               }
            }
        }
    }

And then TabItem style just set the property:

<Style TargetType="TabItem" 
                   BasedOn="{StaticResource StudioTabItem}"
                   > 
<Setter Property="behaviours:TabItemBehaviour.IsCloseButtonVisible" Value="False"/>

Also you will have to give Button a Name "CloseButton" in your ControlTemplate

Upvotes: 1

Related Questions