c# - subrayado - negrita en whatsapp web
¿Cómo tener el primer artículo en negrita en ListBox? (2)
¿Cómo está ordenando la lista para asegurarse de que el artículo que desea sea el primero? El orden de los elementos en un ObservableCollection es el orden en el que se agregaron.
Si tiene un número de secuencia como propiedad de los miembros de la lista, puede simplemente cambiar su convertidor para vincularlo y devolver "negrita" si el número de secuencia es 0 y "normal" en caso contrario.
Tengo un ListBox en el que me gustaría tener solo el primer elemento en negrita.
Ver:
<ListBox x:Name="lstBox" ItemsSource="{Binding List}" DisplayMemberPath="{Binding SequencesDisplayLanguage}" />
Viewmodel:
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");
}
}
Modelo:
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));
}
}
Intenté usar una ItemTemplate, con un convertidor que devuelve FontWeights.Bold
si el artículo es de un tipo particular (me he tomado la precaución de poner ese artículo en particular primero en la lista para que quede en negrita). El código es este:
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock FontWeight="{Binding Converter={StaticResource sequenceToFontWeightConverter}}"
Text="{Binding Path=NameEnglish}" />
</DataTemplate>
</ListBox.ItemTemplate>
pero necesito poder cambiar la ruta de enlace de texto en el tiempo de ejecución ( NameEnglish
o NameRomanian
). Así que intenté hacer referencia a la propiedad en Viewmodel:
Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Path=DataContext.SequencesDisplayLanguage}"/>
pero no funciona (si SequencesDisplayLanguage=="NameEnglish"
, todos los elementos de ListBox aparecerán como "NameEnglish").
Entonces, ¿cómo puedo poner en negrita solamente el primer elemento en el ListBox mientras puedo cambiar la ruta de enlace en el tiempo de ejecución?
ACTUALIZAR
Intenté con la solución de Clemens, pero ahora el elemento resaltado seleccionado ha cambiado: el elemento tiene una altura más grande, un rectángulo con borde y aparece un color diferente al seleccionar (ver imagen).
¿Cómo puedo mantener el tamaño y resaltado del artículo original?
ACTUALIZACIÓN 2
Descubierto:
<Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}">
Puede ListBoxItem
un ListBoxItem
basado en su índice configurando un Trigger
en su propiedad adjunta AlternationIndex
. También debería establecer un valor suficientemente grande para la propiedad 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>