【发布时间】: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>
但我需要能够在运行时更改文本绑定路径(NameEnglish 或 NameRomanian)。所以我尝试在 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}}">
【问题讨论】: