ListBox 항목에 대한 WPF 데이터 템플릿 변경(선택한 경우)
항목이 선택되었는지 여부에 따라 ListBox에 있는 항목의 데이터 템플릿을 변경해야 합니다(선택하면 다른/더 많은 정보 표시).
문제의 ListBox 항목을 클릭할 때(탭핑을 통해서만) 데이터 템플릿(스택 패널)의 맨 위 요소에 GotFocus/LostFocus 이벤트가 표시되지 않고 아이디어가 부족합니다.
가장 쉬운 방법은 "ItemTemplate" 속성이 아닌 "ItemContainerStyle" 템플릿을 제공하는 것입니다.아래 코드에서 "선택되지 않은" 상태에 대한 데이터 템플릿과 "선택된" 상태에 대한 데이터 템플릿 두 개를 만듭니다.그런 다음 항목이 포함된 실제 "ListBoxItem"인 "ItemContainerStyle" 템플릿을 만듭니다.기본 "ContentTemplate"를 "Unselected" 상태로 설정한 다음 "IsSelected" 속성이 참일 때 템플릿을 스왑하는 트리거를 제공합니다.(참고: 코드 뒤에 있는 "ItemsSource" 속성을 단순화를 위해 문자열 목록으로 설정합니다.)
<Window.Resources>
<DataTemplate x:Key="ItemTemplate">
<TextBlock Text="{Binding}" Foreground="Red" />
</DataTemplate>
<DataTemplate x:Key="SelectedTemplate">
<TextBlock Text="{Binding}" Foreground="White" />
</DataTemplate>
<Style TargetType="{x:Type ListBoxItem}" x:Key="ContainerStyle">
<Setter Property="ContentTemplate" Value="{StaticResource ItemTemplate}" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource SelectedTemplate}" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<ListBox x:Name="lstItems" ItemContainerStyle="{StaticResource ContainerStyle}" />
항목을 선택하거나 선택하지 않은 경우 스타일을 설정하려면 다음 항목을 검색하면 됩니다.ListBoxItem
의 부모<DataTemplate>
트리거 스타일이 변경될 수 있습니다.IsSelected
변화들.예를 들어 아래 코드는 다음을 생성합니다.TextBlock
결석으로Foreground
녹색을 띠이제 항목을 선택하면 글꼴이 빨간색으로 바뀌고 마우스가 넘어가면 항목이 노란색으로 바뀝니다.이렇게 하면 약간 변경하려는 모든 상태에 대해 다른 답변에 제시된 대로 별도의 데이터 템플릿을 지정할 필요가 없습니다.
<DataTemplate x:Key="SimpleDataTemplate">
<TextBlock Text="{Binding}">
<TextBlock.Style>
<Style>
<Setter Property="TextBlock.Foreground" Value="Green"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={
RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem }}}"
Value="True">
<Setter Property="TextBlock.Foreground" Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsMouseOver, RelativeSource={
RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem }}}"
Value="True">
<Setter Property="TextBlock.Foreground" Value="Yellow"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
스택 패널은 초점을 맞출 수 없기 때문에 초점이 맞지 않습니다(Focusable= 설정).만약 당신이 그것에 초점을 맞추고 싶다면 사실입니다.그러나 이와 같은 시나리오에서 기억해야 할 핵심은 스택 패널이 TreeView의 하위 항목이라는 것입니다.항목, 이 경우 항목 컨테이너입니다.마이카가 제안한 것처럼, 아이템 용기 스타일을 조정하는 것이 좋은 접근법입니다.
DataTemplates 및 RelativeSource 마크업 확장을 사용하여 목록 보기 항목을 찾는 데이터 트리거를 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/146269/change-wpf-datatemplate-for-listbox-item-if-selected
'programing' 카테고리의 다른 글
핵심 데이터의 모든 항목을 삭제/재설정하시겠습니까? (0) | 2023.05.29 |
---|---|
선택한 모든 빈 셀을 텍스트로 채우는 방법을 Excel (0) | 2023.05.29 |
Perl 배열에 특정 값이 포함되어 있는지 확인하려면 어떻게 해야 합니까? (0) | 2023.05.29 |
ASP.NET MVC 사용자 지정 오류 처리 Application_ErrorGlobal.asax? (0) | 2023.05.29 |
부울을 사용하는 이유.ToString 출력 "참"이 아닌 "참" (0) | 2023.05.24 |