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 |