К примеру, есть класс User. Есть ViewModel, в которой есть свойство LastUser. Свойство периодически обновляется, генерируя NotifyPropertyChanged. На форме, поверх остальных элементов, лежит невидимая панель. При обновлении свойства, необходимо показать панель на несколько секунд, а затем спрятать. Как можно реализовать такое поведение? Есть ли какой-нибудь EventTriger или DataTrigger?
Ответ
Наиболее простым видится вынести в VM отдельное свойство для видимости панели
и сделать метод, который запускать в сеттере LastUser
private async void ShowDetails()
{
IsVisiblePanel = true;
await Task.Delay(TimeSpan.FromSeconds(1));
IsVisiblePanel = false;
}
Если не хотите делать это в VM - можно сделать во View, подписавшись вручную на PropertyChanged и делая тоже самое.
Другой вариант, немного более замороченый - задействовать анимацию.
Давайте будем действовать через прозрачность, у меня вот такая панель:
Обратите внимание, у панели установлен DataContext, это важно, мы этим воспользуемся в дальнейшем.
Давайте добавим в панель стиль и определим триггер, который будет скрывать панель когда она полностью прозрачна:
Хорошо, а теперь управлять прозрачностью будет анимация, для этого запустим ее в EventTrigger
Чтобы событие Binding.TargetUpdated возникало нужно его включить:
DataContext="{Binding SelectedUser, NotifyOnTargetUpdated=True}"
Теперь надо отключить панель в обычном режиме: Opacity="0"
Ну и можно сделать анимацию посимпатичнее:
Полный код панели, на всякий случай:
PS: как раз вчера появилась статья на Хабре, в которой описаны возможные замены подписке на Binding.TargetUpdated
Получается всё можно сделать гораздо проще используя PropertyChangedTrigger из пакета Microsoft.Expression.Interactions
Комментариев нет:
Отправить комментарий