В шаблоне элемента управления WPF Listbox не отображаются шаблон элемента управления Listboxitem и шаблон данных ItemTemplate. - PullRequest
0 голосов
/ 27 января 2020

Когда я использую ItemsControl внутри моего шаблона элемента управления ListBox, мой шаблон элемента управления ListBoxItem не применяется.

У меня есть собственный шаблон элемента управления ListBox вместе с шаблоном элемента управления ListBoxItem, обернутым в стили. В моем главном окне у меня есть объявление ListBox с шаблоном данных.

Шаблоны управления:

<Style TargetType="ListBoxItem" BasedOn="{StaticResource Base_Control_Style}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Border x:Name="border" BorderThickness="0" 
                        BorderBrush="Transparent" Background="Transparent">
                    <ContentPresenter Content="{TemplateBinding Content}" Margin="2"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter TargetName="border" Property="Background" 
                                Value="{StaticResource Base_PrimaryLight}"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="True" >
                        <Setter TargetName="border" Property="Background" 
                                Value="{StaticResource Base_Secondary}"/>
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsMouseOver" Value="True"/>
                            <Condition Property="IsSelected" Value="True"/>
                        </MultiTrigger.Conditions>
                        <MultiTrigger.Setters>
                            <Setter TargetName="border" Property="Background"
                                    Value="{StaticResource Base_SecondaryDark}"/>
                        </MultiTrigger.Setters>
                    </MultiTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Style TargetType="ListBox" BasedOn="{StaticResource Base_Control_Style}">
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Background" Value="{StaticResource Base_PrimaryDark}"/>

    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
    <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBox">
                <Border x:Name="Border" BorderThickness="{TemplateBinding BorderThickness}" 
                        BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}">
                    <ScrollViewer Margin="2">
                        <!--<StackPanel IsItemsHost="true"/>-->
                        <!--<ItemsPresenter/>-->
                        <ItemsControl ItemsSource="{TemplateBinding ItemsSource}" 
                                      ItemTemplate="{TemplateBinding ItemTemplate}"/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Объявление списка:

<ListBox x:Name="recipients_listbox" Margin="10" ItemsSource="{Binding Path=Recipients}" 
                 SelectedValuePath="Email"
                 SnapsToDevicePixels="True"
                 HorizontalContentAlignment="Stretch" ScrollViewer.CanContentScroll="False">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="2,4" HorizontalAlignment="Stretch" >
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="60"/>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="50"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>

                        <Grid.Resources>
                            <Style TargetType="TextBlock">
                                <Setter Property="Foreground" Value="Black"/>
                            </Style>
                        </Grid.Resources>

                        <Image Source="{Binding ImagePath}" 
                               RenderOptions.BitmapScalingMode="HighQuality" 
                               SnapsToDevicePixels="True"
                               Grid.Column="0" Grid.Row="0" Grid.RowSpan="3" 
                               Stretch="UniformToFill" Margin="0,0,10,0"/>

                        <TextBlock Text="Name:" FontWeight="Bold" 
                                   Grid.Column="1" Grid.Row="0" VerticalAlignment="Center"/>
                        <TextBlock Text="Email:" FontWeight="Bold" 
                                   Grid.Column="1" Grid.Row="1" VerticalAlignment="Center"/>
                        <TextBlock Text="Department:" FontWeight="Bold" 
                                   Grid.Column="1" Grid.Row="2" VerticalAlignment="Center"/>

                        <TextBlock VerticalAlignment="Center" Grid.Column="3" Grid.Row="0">
                                    <Run Text="{Binding FirstName}"/>
                                    <Run Text="{Binding LastName}"/>
                        </TextBlock>
                        <TextBlock Text="{Binding Email}" 
                                   VerticalAlignment="Center" Grid.Column="3" Grid.Row="1"/>
                        <TextBlock Text="{Binding Department}" 
                                   VerticalAlignment="Center" Grid.Column="3" Grid.Row="2"/>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Проблема в том, что когда я используйте ItemsControl внутри моего шаблона элемента управления ListBox, мой шаблон элемента управления ListBoxItem не применяется (триггеры, изменяющие цвет фона, не активируются), в то время как мой шаблон данных имеет вид.

ListBox with ItemsControl

ListBox with ItemsControl

Я попытался использовать StackPanel с isItemsHost = True, а также ItemsPresenter. Оба эти параметра применили мой шаблон элемента управления ListBoxItem, но не применили мой шаблон данных.

ListBox с StackPanel или ItemsPresenter

ListBox with StackPanel or ItemsPresenter

Есть ли способ применить и мой элемент управления ListBoxItem, и шаблон данных?

1 Ответ

0 голосов
/ 27 января 2020

ContentPresenter в ControlTemplate в вашем стиле ListBoxItem не использует свойство ContentTemplate, которое содержит DataTemplate свойства ItemTemplate ListBox.

Добавить соответствующую привязку TemplateBinding:

<Style TargetType="ListBoxItem">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBoxItem">
                <Border ...>
                    <ContentPresenter Content="{TemplateBinding Content}"
                                      ContentTemplate="{TemplateBinding ContentTemplate}"
                                      Margin="2"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    ...
</Style>

Затем либо используйте ItemsPresenter в ControlTemplate ListBox, либо вообще не устанавливайте свойство Template:

<Style TargetType="ListBox">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBox">
                <Border BorderThickness="{TemplateBinding BorderThickness}" 
                        BorderBrush="{TemplateBinding BorderBrush}"
                        Background="{TemplateBinding Background}">
                    <ScrollViewer Margin="2">
                        <ItemsPresenter/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    ...
</Style>
...