2016-07-02 4 views
0

У меня есть ListBox, в котором я хотел бы иметь только первый элемент, выделенный жирным шрифтом.Как получить первый элемент, выделенный жирным шрифтом в ListBox?

Вид:

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

Модель:

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, имея возможность изменить путь привязки во время выполнения?

UPDATE

Я попытался решением Клеменса, но теперь выбранный элемент подсветка изменилась: элемент имеет большую высоту, прямоугольник с границей и другой цвет появляется при выборе (смотрите рисунок).

enter image description here

Как я могу сохранить оригинальный размер пункта и выделение?

UPDATE 2

Обнаруженные:

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

ответ

4

Вы можете создать ListBoxItem на основе его индекса, установив Trigger на свой AlternationIndex приложенное свойство. Вы также должны установить достаточно большое значение для 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> 
+0

Благодарим вас за прекрасное обходное решение.Однако выделение выделенного элемента изменилось (см. Обновленный ответ). Вы знаете, как сохранить первоначальное поведение? –

+0

Обнаружено: '