如何使第一项在ListBox中加粗?

Cri*_*n M 1 c# wpf xaml listbox mvvm

我有一个ListBox,我只想将第一项加粗。

视图:

<ListBox x:Name="lstBox" ItemsSource="{Binding List}" DisplayMemberPath="{Binding SequencesDisplayLanguage}" />
Run Code Online (Sandbox Code Playgroud)

视图模型:

private ObservableCollection<Sequence> _list = new ObservableCollection<Sequence>() { };
public ObservableCollection<Sequence> List { get { return _list; } }

private string _sequencesDisplayLanguage = "NameEnglish";
public string SequencesDisplayLanguage
{
    get
    {
        return _sequencesDisplayLanguage;
    }
    set
    {
        _sequencesDisplayLanguage = value;
        OnPropertyChanged("SequencesDisplayLanguage");
    }
}
Run Code Online (Sandbox Code Playgroud)

模型:

public class Sequence : INotifyPropertyChanged
{
    public Sequence()
    {
        NameEnglish = "";
        NameRomanian = "";
    }

    private string _nameEnglish;
    public string NameEnglish
    {
        get
        {
            return _nameEnglish;
        }
        set
        {
            _nameEnglish = value;
            OnPropertyChanged("NameEnglish");
        }
    }
    private string _nameRomanian;
    public string NameRomanian
    {
        get
        {
            return _nameRomanian;
        }
        set
        {
            _nameRomanian = value;
            OnPropertyChanged("NameRomanian");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过使用ItemTemplate,带有一个转换器,该转换器返回FontWeights.Bold该项目是否为特定类型(我已经小心地将该特定项目放在列表中,因此它将以粗体显示)。代码是这样的:

<ListBox.ItemTemplate>
  <DataTemplate>
    <TextBlock FontWeight="{Binding Converter={StaticResource sequenceToFontWeightConverter}}"
                       Text="{Binding Path=NameEnglish}" />
  </DataTemplate>
</ListBox.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

但是我需要能够在运行时(NameEnglishNameRomanian)更改文本绑定路径。因此,我尝试在Viewmodel中引用该属性:

Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Path=DataContext.SequencesDisplayLanguage}"/>
Run Code Online (Sandbox Code Playgroud)

但它不起作用(如果SequencesDisplayLanguage=="NameEnglish"所有ListBox项都显示为“ NameEnglish”)。

因此,如何在运行时更改绑定路径的同时如何仅粗体显示ListBox中的第一项?

更新

我尝试了Clemens的解决方案,但是现在选中的项目突出显示已更改:该项目具有更高的高度,选择时会出现带有边框和不同颜色的矩形(请参见图片)。

在此处输入图片说明

如何保持原始项目的大小和突出显示?

更新2

发现:

<Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}">
Run Code Online (Sandbox Code Playgroud)

Cle*_*ens 5

您可以ListBoxItem通过Trigger在其AlternationIndex附加属性上设置a 来根据其索引设置样式。您还必须为该AlternationCount属性设置足够大的值:

<ListBox ItemsSource="{Binding List}" AlternationCount="2147483647">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Style.Triggers>
                <Trigger Property="ItemsControl.AlternationIndex" Value="0">
                    <Setter Property="FontWeight" Value="Bold"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
Run Code Online (Sandbox Code Playgroud)