Событие WPF ListViewItem lost focus - Как попасть на мероприятие?
-
19-08-2019 - |
Вопрос
У меня есть listview, в котором вы выбираете строку / элемент.Это связано с дататриггером, который отображает изображение в строке.Изображение должно отображаться только тогда, когда выбрана строка.
Эта часть работает нормально, однако, когда вы перемещаете фокус на что-то другое, например, текстовое поле, или отображается messagebox, listviewitem теряет фокус, т. Е. выделение в строке больше не отображается.Проблема в том, что мой образ все еще сохраняется.Он должен быть скрыт / свернут, когда listview теряет фокус...Это отлично работает, если вы выберете другой элемент / строку в listview.
Кто-нибудь может помочь в этом, пожалуйста?
<Style x:Key="deleteImageStyle" TargetType="{x:Type Image}">
<Setter Property="Source" Value="Resources/iconDelete.png" />
<Setter Property="Margin" Value="0,2,5,0" />
<Setter Property="Height" Value="16" />
<Setter Property="Width" Value="16" />
<Setter Property="HorizontalAlignment" Value="Right" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="Cursor" Value="Hand" />
<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="Hidden"/>
</DataTrigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Visibility" Value="Hidden" />
</Trigger>
</Style.Triggers>
</Style>
С уважением
ТрэвисПУК
Решение
Я думаю, вы путаете IsSelected и isFocused.
Поэкспериментируйте с привязкой ваших триггеров к Сфокусирован вместо IsSelected выбирается для получения желаемого результата.
Если я правильно понимаю, вы хотите, чтобы изображение было видно только в том случае, если оба параметра IsSelected и isFocused имеют значение true, в противном случае они скрыты.
Один из способов сделать это - установить видимость по умолчанию на Видимую, а затем добавить два триггера, которые устанавливают видимость на Скрытую:один триггер для IsSelected = False и другой триггер для isFocused = False.
Или наоборот, установите видимость по умолчанию на Скрытую и используйте мультитриггер с IsSelected = True и isFocused = True, чтобы установить для нее видимость на Visible
Другие советы
@Bubblewrap Пузырчатая Пленка,
Спасибо за информацию, это довольно хорошо обошло проблему.Как показано ниже, мне пришлось добавить в обоих сценариях, поскольку значение по умолчанию, похоже, не вступает в силу...однако я еще не пробовал метод мультитриггера, сделаю позже.
Это то, к чему я в итоге пришел.
<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=IsFocused}" 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="Hidden"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsFocused}" Value="False">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Visibility" Value="Hidden" />
</Trigger>
</Style.Triggers>
Спасибо за вашу помощь, на данный момент это поможет мне решить мою проблему.Я думаю, что мой триггер IsEnabled, вероятно, сейчас избыточен.
Спасибо
ТрэвисПУК