Вы можете предоставить свойство IsFirstInSelection в своем классе ViewData (я полагаю, у вас оно есть).
Тогда вы можете разместить DataTrigger для мониторинга изменений, например:
<Style.Triggers>
<DataTrigger Binding="{Binding IsFirstInSelection}">
<Setter Property="Background"
Value="Blue"/>
</DataTrigger>
</Style.Triggers>
Также в вашем случае я бы рекомендовал избегать изменения HighlightBrushKey, но достигать своей цели путем изменения свойства Background.Вы также можете открыть свойство IsSelected в классе ViewData, чтобы оно выглядело так:
public class ViewData: ObservableObject
{
private bool _isSelected;
public bool IsSelected
{
get
{
return this._isSelected;
}
set
{
if (this._isSelected != value)
{
this._isSelected = value;
this.OnPropertyChanged("IsSelected");
}
}
}
private bool _isFirstInSelection;
public bool IsFirstInSelection
{
get
{
return this._isFirstInSelection;
}
set
{
if (this._isFirstInSelection != value)
{
this._isFirstInSelection = value;
this.OnPropertyChanged("IsFirstInSelection");
}
}
}
}
И ваш стиль устанавливает фон на основе обоих свойств:
<Style x:Key="TreeItemStyle"
TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected"
Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
<Setter Property="IsFirstInSelection"
Value="{Binding Path=IsFirstInSelection}"/>
<Setter Property="Background"
Value="Green"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected}"
Value="True">
<Setter Property="Background"
Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsFirstInSelection}">
<Setter Property="Background"
Value="Blue"/>
</DataTrigger>
</Style.Triggers>
</Style>
Конечно, в модели или в представленииЗа кодом вы должны следить за уведомлениями об изменении свойства IsSelected и устанавливать / сбрасывать IsFirstInSelection в соответствии с выбранными элементами.
Надеюсь, вы понимаете мою идею.
------- РЕДАКТИРОВАНИЕ --------
Сначала я продолжаю настаивать на том, чтобы вы разработали правильный класс ViewData:
public class ViewData : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
var ev = this.PropertyChanged;
if (ev != null)
{
ev(this, new PropertyChangedEventArgs(propertyName));
}
}
public ViewData(string name)
{
this._personName = name;
}
private string _personName;
public string PersonName
{
get
{
return this._personName;
}
set
{
if (this._personName != value)
{
this._personName = value;
this.OnPropertyChanged("PersonName");
}
}
}
private bool _isFirstSelected;
public bool IsFirstSelected
{
get
{
return this._isFirstSelected;
}
set
{
if (this._isFirstSelected != value)
{
this._isFirstSelected = value;
this.OnPropertyChanged("IsFirstSelected");
}
}
}
}
Во время обработки события SelectionChanged вы должны изменить свойство IsFirstSelected следующим образом:
public ObservableCollection<ViewData> MyList { get; set; }
private void SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var lb = sender as ListBox;
if (lb != null)
{
MyLabel.Content = lb.SelectedItem;
foreach (var item in this.MyList)
{
if (item == lb.SelectedItem)
{
item.IsFirstSelected = true;
}
else
{
item.IsFirstSelected = false;
}
}
}
}
Но шаблон ListViewItem по умолчанию не реагирует на установщики фона, поэтому вы должны переопределить его шаблон в стиле:
<Style TargetType="{x:Type ListViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter Content="{Binding PersonName}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected"
Value="True">
<Setter Property="Background"
Value="Yellow"/>
</Trigger>
<DataTrigger Binding="{Binding IsFirstSelected}"
Value="True">
<Setter Property="Background"
Value="Aqua" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Если это решение не подходит, пожалуйста, сообщите мне.У меня есть некоторые идеи, но у меня нет достаточно времени, чтобы проверить их в коде прямо сейчас.