【问题标题】:How to have first item bolded in ListBox?如何在 ListBox 中将第一项加粗?
【发布时间】:2016-11-04 16:41:45
【问题描述】:

我有一个 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 中的第一项加粗?

更新

我尝试了 Clemens 的解决方案,但现在选中的项目突出显示发生了变化:项目的高度变大了,选择时出现了一个带边框和不同颜色的矩形(见图)。

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

更新 2

发现:

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

【问题讨论】:

    标签: c# wpf xaml mvvm listbox


    【解决方案1】:

    您可以通过在其AlternationIndex 附加属性上设置Trigger 来根据其索引设置ListBoxItem 的样式。您还必须为 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>
    

    【讨论】:

    • 感谢您提供的解决方法。但是,所选项目突出显示已更改(请参阅更新的答案)。你知道如何保持原有的行为吗?
    • 发现:&lt;Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}"&gt;
    • @CristianM 没有必要明确地将 ListBoxItem 样式基于默认 ListBoxItem 样式。默认情况下会发生这种情况。你可能在某个地方有其他一些 ListBoxItem 样式吗?
    • 不,我没有定义其他样式。可能是因为我使用的是 MahApps(它是否包含 ListBoxItem 样式)?
    【解决方案2】:

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

    如果您有一个序列号作为列表成员的属性,那么您可以简单地更改您的转换器以绑定到该序列号,如果序列号为 0,则返回“粗体”,否则返回“正常”。

    【讨论】:

    • 对不起,其实它是一个 ObservableCollectionEx (extended) 有排序的可能,但我放 ObservableCollection 是为了避免让代码的理解复杂化。我没有序列号属性,但感谢您的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多