В WPF триггер изменили реализацию в класс DataTemplate для элементов списка
У меня есть список, и у меня есть следующий ItemTemplate для него:
<DataTemplate x:Key="ScenarioItemTemplate">
<Border Margin="5,0,5,0"
Background="#FF3C3B3B"
BorderBrush="#FF797878"
BorderThickness="2"
CornerRadius="5">
<DockPanel>
<DockPanel DockPanel.Dock="Top"
Margin="0,2,0,0">
<Button HorizontalAlignment="Left"
DockPanel.Dock="Left"
FontWeight="Heavy"
Foreground="White" />
<Label Content="{Binding Path=Name}"
DockPanel.Dock="Left"
FontWeight="Heavy"
Foreground="white" />
<Label HorizontalAlignment="Right"
Background="#FF3C3B3B"
Content="X"
DockPanel.Dock="Left"
FontWeight="Heavy"
Foreground="White" />
</DockPanel>
<ContentControl Name="designerContent"
Visibility="Collapsed"
MinHeight="100"
Margin="2,0,2,2"
Content="{Binding Path=DesignerInstance}"
Background="#FF999898">
</ContentControl>
</DockPanel>
</Border>
</DataTemplate>
Как вы можете видеть, ContentControl имеет видимость, установленную в collapsed.
Мне нужно определить триггер, который заставляет видимость быть установленной в "видимый"
когда ListItem выбран, но я не могу понять это.
какие идеи?
обновление: конечно, я мог бы просто дублировать DataTemplate и добавить триггеры
к списку, о котором идет речь, чтобы использовать либо одно, либо другое, но я хочу предотвратить дублирование этого кода.
2 ответов:
Вы можете стиль вашего ContentControl таким образом, что триггер срабатывает, когда его контейнер (ListBoxItem) становится выбран:
<ContentControl x:Name="designerContent" MinHeight="100" Margin="2,0,2,2" Content="{Binding Path=DesignerInstance}" Background="#FF999898"> <ContentControl.Style> <Style TargetType="{x:Type ContentControl}"> <Setter Property="Visibility" Value="Collapsed"/> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> </Style.Triggers> </Style> </ContentControl.Style> </ContentControl>кроме того, я думаю, что вы можете добавить триггер в сам шаблон и ссылаться на элемент управления по имени. Я не знаю эту технику достаточно хорошо, чтобы ввести ее из памяти и предположить, что она будет работать, но это что-то вроде этого:
<DataTemplate x:Key="ScenarioItemTemplate"> <DataTemplate.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True"> <Setter TargetName="designerContent" Property="Visibility" Value="Visible"/> </DataTrigger> </DataTemplate.Triggers> ... </DataTemplate>
@Мэтт, спасибо!!!
просто нужно было добавить триггер для IsSelected = = false, а также, и теперь это работает как шарм!
<ContentControl.Style> <Style TargetType="{x:Type ContentControl}"> <Setter Property="Visibility" Value="Collapsed"/> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="False"> <Setter Property="Visibility" Value="Collapsed"/> </DataTrigger> </Style.Triggers> </Style>
Comments