如何在ListBox中加粗第一项?

时间:2016-07-02 11:09:56

标签: c# wpf xaml mvvm listbox

我有一个ListBox,我希望只有第一个项目加粗。

查看:

<ListBox x:Name="lstBox" ItemsSource="{Binding List}" DisplayMemberPath="{Binding SequencesDisplayLanguage}" />

视图模型:

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");
    }
}

型号:

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));
    }
}

我尝试过使用ItemTemplate,如果项目属于特定类型,则会返回FontWeights.Bold的转换器(我已经注意将该特定项放在列表的第一位,因此它将以粗体显示) 。代码是这样的:

<ListBox.ItemTemplate>
  <DataTemplate>
    <TextBlock FontWeight="{Binding Converter={StaticResource sequenceToFontWeightConverter}}"
                       Text="{Binding Path=NameEnglish}" />
  </DataTemplate>
</ListBox.ItemTemplate>

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

Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Path=DataContext.SequencesDisplayLanguage}"/>

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

那么,如何在运行时更改绑定路径时,如何只加粗ListBox中的第一项呢?

更新

我尝试过克莱门斯的解决方案,但现在所选的项目突出显示已经改变:项目有一个更大的高度,一个带边框的矩形和选择时会出现不同的颜色(见图片)。

enter image description here

如何保留原始项目大小并突出显示?

更新2

发现:

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

2 个答案:

答案 0 :(得分:5)

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

AlternationCount

答案 1 :(得分:1)

您如何订购列表以确保您想要的项目是第一个? ObservableCollection中的项目顺序是它们的添加顺序。

如果您有一个序列号作为列表成员的属性,那么您只需将转换器更改为绑定到该列表并返回&#34; bold&#34;如果序列号为0且&#34;正常&#34;否则。