Как мне изменить фон элементов управления в моем UserControl при выборе элемента

#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>