如何更改所选项目的WPF Listbox / ListBoxItem DataTemplate而不影响样式和&主题化?

时间:2010-02-01 09:07:11

标签: wpf templates xaml data-binding themes

这个问题与Change WPF DataTemplate...非常相似,我已阅读并实施了该问题。它起初很漂亮,但我遇到了问题。

问题在于,当您在应用程序中使用主题(例如WPF Futures project中的主题时)(例如Expression Dark),ListBoxItems都会恢复为默认的WPF样式。这打破了这些元素的主题,例如,在黑色背景上生成黑色文本,否则文本将为白色。这也影响了我的TreeView,可能会影响其他类似的控件。

我认为这是因为为ListBox.ItemContainerStyle设置了冲突的样式 - 一个来自主题,另一个用于切换数据模板。

我四处寻找其他解决方案,但还没有找到任何解决方案。以下是我迄今为止的主要观点或想法:

  1. DataTemplateSelector进行子类化并将其设置为ListBox.ItemTemplateSelector。 (目前最好的选择)。
  2. 不知何故,某处使用Trigger,DataTrigger或EventTrigger。
  3. 放弃主题。
  4. 以某种方式破解我想要的主题功能。
  5. 以某种方式使我的自定义ItemContainerStyle以某种方式从主题的风格继承它的颜色和眼睛糖果。 (我简单地尝试了一下,它没有用。)
  6. 这是我的ListBox和相关部分:

    <Window.Resources>
    
      <DataTemplate x:Key="NormalTemplate">
          ...
      </DataTemplate>
    
      <DataTemplate x:Key="SelectedTemplate">
          ...
      </DataTemplate>
    
    </Window.Resources>
    
    <ListBox x:Name="RegisterListBox" Grid.Row="0"
             HorizontalContentAlignment="Stretch"
             ItemsSource="{Binding Adjustments}">
    
        <!-- this is from the post referenced above -->
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="ContentTemplate" Value="{StaticResource NormalTemplate}"/>
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="ContentTemplate" Value="{StaticResource SelectedTemplate}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>
    

    在代码中设置Listbox.DataContext以启用ItemsSource绑定。

    我是如何在保持对主题的无缝支持的同时实现上述功能的?

1 个答案:

答案 0 :(得分:5)

你尝试过这样的事吗?

<ListBox.ItemContainerStyle>
    <Style 
        TargetType="{x:Type ListBoxItem}" 
        BasedOn="{StaticResource {x:Type ListBoxItem}}">    <=====
...

这个想法是框架首先会找到一个等于typeof(ListBoxItem)的键的样式,它会在主题中找到它,然后你的样式只会扩展主题的样式和你的具体细节。