Wpf 如何更改组合框SelectedItem的字体系列?

Wpf 如何更改组合框SelectedItem的字体系列?,wpf,xaml,combobox,Wpf,Xaml,Combobox,我有一个组合框的风格。并为其设置字体系列 为项目设置字体,但不为所选项目设置字体 <DataTemplate x:Key="SelectionBoxTextTemplate"> <TextBlock FontFamily="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=FontFamily}" Text="{Binding}"/&g

我有一个组合框的风格。并为其设置字体系列

为项目设置字体,但不为所选项目设置字体

<DataTemplate x:Key="SelectionBoxTextTemplate">
     <TextBlock FontFamily="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=FontFamily}" Text="{Binding}"/>
</DataTemplate>
<Style x:Key="{x:Type ComboBox}" TargetType="{x:Type ComboBox}">
    <Setter Property="MinWidth" Value="120"/>
    <Setter Property="FontFamily" Value="{StaticResource IranSansFontFamily}"/>
     <Setter Property="Template">
        <Setter.Value>
           <ControlTemplate TargetType="{x:Type ComboBox}">
              <Grid>
                 <ToggleButton
                    Name="ToggleButton"
                    Grid.Column="2"
                    ClickMode="Press"
                    Focusable="false"
                    IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}"
                    Template="{StaticResource ComboBoxToggleButton}">
                 </ToggleButton>
                 <ContentPresenter
                    Name="ContentSite"
                    HorizontalAlignment="Left"
                    Margin="3,3,23,3"
                    VerticalAlignment="Center"
                    Content="{TemplateBinding SelectionBoxItem}"
                    ContentTemplate="{StaticResource SelectionBoxTextTemplate}"
                    ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
                    IsHitTestVisible="False"/>

您可以使用自定义模板选择器,如下所示:

  public class ComboBoxItemTemplateSelector : DataTemplateSelector
    {
        public DataTemplate SelectedItemTemplate { get; set; }
        public DataTemplate ItemTemplate { get; set; }
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            bool selected = false;
            FrameworkElement fe = container as FrameworkElement;
            if (fe != null)
            {
                DependencyObject parent = fe.TemplatedParent;
                if (parent != null)
                {
                    ComboBox cbo = parent as ComboBox;
                    if (cbo != null)
                        selected = true;
                }
            }
            if (selected)
                return SelectedItemTemplate;
            else
                return ItemTemplate;
        }
    }
在xaml中:

 <ComboBox Name="cb" Height="28">
            <ComboBox.ItemTemplateSelector>
                <local:ComboBoxItemTemplateSelector>
                    <local:ComboBoxItemTemplateSelector.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding}" FontFamily="Comic Sans MS"/>
                        </DataTemplate>
                    </local:ComboBoxItemTemplateSelector.ItemTemplate>
                    <local:ComboBoxItemTemplateSelector.SelectedItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding}" FontFamily="Arial Black"/>
                        </DataTemplate>
                    </local:ComboBoxItemTemplateSelector.SelectedItemTemplate>
                </local:ComboBoxItemTemplateSelector>
            </ComboBox.ItemTemplateSelector>
        </ComboBox>
结果是:


您需要在IsSelected属性上使用触发器。有关示例,请参见。它适用于列表框,但也适用于组合框。

谢谢,我使用它,但出现错误:当DisplayMemberPath使用时,无法设置SelectedItemTemplate DisplayMemberPath指定要显示的属性的名称。由于选择了EditemTemplate,因此可以在其绑定中指定属性名称。那么,你可以发布你原来的xaml吗?