programing

ListBox 항목에 대한 WPF 데이터 템플릿 변경(선택한 경우)

megabox 2023. 5. 29. 10:28
반응형

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

반응형