Я реализовал некоторый список, который содержит границу и сетку на этой границе.
<Style x:Key = "SelectedHiglightStyle"
TargetType = "{x:Type ListBoxItem}"
BasedOn = "{StaticResource MaterialDesignListBoxItem}">
<Style.Resources>
<SolidColorBrush x:Key = "{x:Static SystemColors.HighlightBrushKey}"
Color = "Transparent" />
<SolidColorBrush x:Key = "{x:Static SystemColors.ControlBrushKey}"
Color = "Transparent" />
</Style.Resources>
<Style.Triggers>
<Trigger Property = "IsSelected"
Value = "True">
<Setter Property = "Background"
Value = "#316308" />
<Setter Property = "Opacity"
Value = "0.8" />
</Trigger>
</Style.Triggers>
</Style>
<ListBox IsSynchronizedWithCurrentItem = "True"
HorizontalAlignment = "Stretch"
VerticalAlignment = "Stretch"
Grid.Row = "3"
ScrollViewer.CanContentScroll = "False"
Style = "{StaticResource MaterialDesignListBox}"
ItemsSource = "{Binding Devices}"
SelectedItem = "{Binding SelectedDevice, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"
ItemContainerStyle = "{StaticResource SelectedHiglightStyle}">
<ListBox.ItemTemplate>
<DataTemplate>
<Border>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid Grid.Column = "0">
<Rectangle Width = "35"
Height = "35"
Margin = "5"
HorizontalAlignment = "Left"
OpacityMask = "{DynamicResource DashboardDeviceLogo}">
<Rectangle.Fill>
................
<Grid Grid.Column = "1">
<StackPanel>
<TextBlock Text = "{lex:Loc DeviceName}"
Margin = "0,4,0,2" />
<TextBlock x:Name = "tbDeviceName"
Text = "{Binding Device.Name}"
FontSize = "10" />
................
Как я могу изменить цвет границы выбранного элемента? У каждого предмета своя модель просмотра. Есть ли более простой способ, чем широковещательное сообщение через Messanger (я использую MVVM Light), захватить его во всех DeviceViewModel's, сравнить идентификатор устройства и затем привязать цвет из модели представления?





Самый простой способ сделать это здесь.
Если вам нужно просто изменить границу выбора, вы пишете это в разделе триггеров стиля listboxitem
<Trigger Property = "IsSelected" Value = "True">
<!--your code...-->
<Setter Property = "BorderBrush"
Value = "Red"/>
<Setter Property = "BorderThickness" Value = "1"/>
</Trigger>
И отредактируйте свой datatemplate, привязав вашу границу к установщикам borderbrush и borderthickness в стиле
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush = "{TemplateBinding BorderBrush}" BorderThickness = "{TemplateBinding BorderThickness}">...
Я отредактировал свой ответ, потому что впервые, когда я прочитал этот вопрос, я подумал, что вам нужны разные кисти для каждого типа данных. Но твой случай намного проще
Вы можете определить Style с помощью DataTrigger, который связывается со свойством IsSelected родительского контейнера ListBoxItem:
<ListBox.ItemTemplate>
<DataTemplate>
<Border>
<Border.Style>
<Style TargetType = "Border">
<Setter Property = "BorderThickness" Value = "2" />
<Setter Property = "BorderBrush" Value = "Black" />
<Style.Triggers>
<DataTrigger Binding = "{Binding IsSelected, RelativeSource = {RelativeSource AncestorType=ListBoxItem}}"
Value = "True">
<Setter Property = "BorderBrush" Value = "Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
...
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
Style применяется к элементу Border в вашем ItemTemplate.
За работой. Спасибо :)
Лучше менять фон контейнера, а не сам предмет. У вас уже есть
ItemContainerStyleс подозрительным именемSelectedHiglightStyle, который, судя по названию, должен делать что-то подобное.