반응형
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가 축소됨으로 설정되어 있습니다.
가시성을 "표시"로 설정하는 트리거를 정의해야합니다.
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>
Alternatively, I think you can add the trigger to the template itself and reference the control by name. I don't know this technique well enough to type it from memory and assume it'll work, but it's something like this:
<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, Thank you!!!
Just had to add a trigger for IsSelected == false as well, and now it works like a charm!
<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>
반응형
'Program Tip' 카테고리의 다른 글
Android UI 스레드 메시지 큐 디스패치 순서 (0) | 2020.12.11 |
---|---|
R3.3 용 udunits2 패키지 설치 (0) | 2020.12.11 |
gcov 기호는 어디에 있습니까? (0) | 2020.12.11 |
C # 코드에서 wpf의 ResourceDictionary에 어떻게 액세스 할 수 있습니까? (0) | 2020.12.11 |
Html Agility Pack은 여전히 최고의 .NET HTML 파서입니까? (0) | 2020.12.11 |