#c# #.net #wpf #mvvm
#c# #.net #wpf #mvvm
Вопрос:
Итак, у меня есть этот ListView, в котором есть DataTemplate моего UserContol, потому что я хотел создать пользовательский дизайн для своего ListView, и он выглядит так
<ListView x:Name="LeftMenuListView"
ItemsSource="{Binding MenuItems}"
SelectedItem="{Binding SelectedMenuItem}"
BorderThickness="0"
Width="255">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<local:MenuItemControl/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Супер просто, теперь, когда элемент выбран, все меняет цвет
, который я хочу, чтобы он выглядел великолепно, imo
<Style TargetType="ListViewItem">
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border
Name="Border"
BorderThickness="0">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Border" Property="Background"
Value="#444444"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Но внутри моего usercontrol есть граница шириной 10 пикселей с именем SmallBorder.
Я хочу изменить цвет этого элемента на зеленый при выборе элемента, но я понятия не имею, как получить доступ к этому свойству
Мой пользовательский контроллер
<Grid Background="Transparent">
<TextBlock Text="{Binding Name}"
VerticalAlignment="Center"
Margin="20,0,0,0"
Foreground="#9e9e9e"
FontFamily="Tahoma"/>
<Border Width="10"
HorizontalAlignment="Left"
x:Name="SmallBorder"/>
</Grid>
Итак, как мне изменить цвет SmallBorder
, когда элемент выбран, а затем, когда он не выбран, он становится прозрачным?
Ответ №1:
ViewModel, который является DataContext вашего usercontrol, должен предоставлять свойство типа IsSelected, затем вы можете добавить стиль с помощью DataTrigger, который реагирует на изменение этого свойства.
Редактировать:
Объявите стиль для самой границы и получите к нему доступ как к StaticResource: Он может быть помещен в ResourceDictionary в YourUserControl.Ресурсы или встроенные в объявление пограничного контроля:
<Style TargetType={x:Type Border} x:Key=SelectedBorderStyle>
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="True">
<Setter Property="BorderBrush" Value="Green" />
</DataTrigger>
</Style.Triggers>
</Style>
И тогда ваш UserControl будет:
<Grid Background="Transparent">
<TextBlock Text="{Binding Name}"
VerticalAlignment="Center"
Margin="20,0,0,0"
Foreground="#9e9e9e"
FontFamily="Tahoma"/>
<Border Width="10"
Style={StaticResource SelectedBorderStyle}
HorizontalAlignment="Left"/>
</Grid>
Обратите внимание, что теперь вам не нужно задавать имя для границы.
Комментарии:
1.
TargetName="SmallBorder"
не распознается, хотя, почему это так?2. Имеет смысл, я написал это так, как если бы это был элемент ControlTemplate, что вам нужно сделать, это создать и оформить саму границу, см. Мое редактирование.
Ответ №2:
A Border
невидим, если в нем что-то есть, но вы можете заменить Border
на a Grid
и использовать a Style
с a DataTrigger
, который привязывается к IsSelected
свойству:
<Grid Background="Transparent">
<TextBlock Text="{Binding Name}"
VerticalAlignment="Center"
Margin="20,0,0,0"
Foreground="#9e9e9e"
FontFamily="Tahoma"/>
<Grid Width="10"
HorizontalAlignment="Left"
x:Name="SmallBorder">
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem}}" Value="True">
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>
</Grid>