반응형
ListBox 항목용 DataTemplate의 IsSelected에 대한 WPF 트리거
목록 상자가 있고 다음 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의 가시성은 축소됩니다.
Visibility를 "Visible"로 설정하는 트리거를 정의해야 합니다.
ListItem이 선택되어 있는데 알 수가 없어요.
좋은 생각 있어요?
업데이트: 물론 DataTemplate를 복제하고 트리거를 ListBox에 추가하여 둘 중 하나를 사용할 수 있지만 이 코드 중복을 방지하고 싶습니다.
컨테이너(ListBoxItem)가 선택되면 트리거가 발생하도록 ContentControl 스타일을 지정할 수 있습니다.
<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>
@Matt, 고마워!!!
Is Selected == 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>
언급URL : https://stackoverflow.com/questions/248545/wpf-trigger-for-isselected-in-a-datatemplate-for-listbox-items
반응형
'programing' 카테고리의 다른 글
POST 메서드를 사용한Swift에서의 HTTP 요구 (0) | 2023.04.19 |
---|---|
목표-C: 경로 문자열에서 파일 이름 추출 (0) | 2023.04.19 |
vim shell 명령 내에서 .bashrc 별칭을 사용하려면 어떻게 해야 합니까? (:!...) (0) | 2023.04.19 |
Oracle의 행과 동등SQL Server의 ID (0) | 2023.04.13 |
Excel 날짜에서 Unix 타임스탬프까지 (0) | 2023.04.13 |