Why is the Style defined inside of the control being ignored?

122 Views Asked by At

I have a ListBox inside a UserControl with its style defined in the ListBox.Resources, but the style is being ignored. We add a generic ListBox style in the Application.Resources.

Why does the Application.Resources style take presedence over the style defined in the control's resources?

This is how I define the ListBox and its style:

<ListBox x:Name="myListBox" SelectionMode="Extended" >            
    <ListBox.Resources>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>                                        
                                </Grid.ColumnDefinitions>
                                <Border Margin="0" Padding="2" Grid.Column="0" Grid.ColumnSpan="2" x:Name="Background" CornerRadius="0" Background="Transparent" BorderThickness="0" BorderBrush="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                                <CheckBox x:Name="myCheckBox" Grid.Column="0" IsChecked="{Binding MyBoolean}" 
                                      HorizontalAlignment="Center" IsThreeState="False" VerticalAlignment="Center" Background="Transparent" Click="myCheckBox_Click"/>
                                <TextBlock Grid.Column="1" Text="{Binding ItemName}" VerticalAlignment="Center" Margin="4,1,2,4">
                                    <TextBlock.Style>
                                        <Style TargetType="TextBlock">
                                            <Setter Property="Foreground" Value="Black" />                                                
                                        </Style>
                                    </TextBlock.Style>
                                </TextBlock>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.Resources>
</ListBox>

This is how we add the ListBox generic style in the App.xaml - Application.Resources:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>                         
            <ResourceDictionary Source="pack://application:,,,/MyAssembly;component/MyListBoxGenericStyle.xaml" />                
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Also, if I define the Style inside the ListBox.ItemContainerStyle it seems to work:

<ListBox x:Name="myListBox" SelectionMode="Extended" >            
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>                                        
                                </Grid.ColumnDefinitions>
                                <Border Margin="0" Padding="2" Grid.Column="0" Grid.ColumnSpan="2" x:Name="Background" CornerRadius="0" Background="Transparent" BorderThickness="0" BorderBrush="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                                <CheckBox x:Name="myCheckBox" Grid.Column="0" IsChecked="{Binding MyBoolean}" 
                                      HorizontalAlignment="Center" IsThreeState="False" VerticalAlignment="Center" Background="Transparent" Click="myCheckBox_Click"/>
                                <TextBlock Grid.Column="1" Text="{Binding ItemName}" VerticalAlignment="Center" Margin="4,1,2,4">
                                    <TextBlock.Style>
                                        <Style TargetType="TextBlock">
                                            <Setter Property="Foreground" Value="Black" />                                                
                                        </Style>
                                    </TextBlock.Style>
                                </TextBlock>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.Resources>
</ListBox>
2

There are 2 best solutions below

0
Cliff Knasinski On

You should define the style listed under the list-box resources under the dictionary instead. Putting styles or templates under the element to be manipulated is akin to ignoring CSS and doing styles directly in the element in HTML.

You can give the dictionary resource template a name and reference it in the tag as

<ListBox ItemTemplate="{StaticResource MyTemplate}">
0
Alex Seleznyov On

Check if MyListBoxGenericStyle.xaml's style doesn't have ItemContainerStyle set explicitly to another value. This would render your default style useless.

Also, you can check by means of Snoop where does your ListBoxItem gets it style from (i.e. locally set, resources, theme, etc).