Страницы

Поиск по вопросам

вторник, 21 мая 2019 г.

Изменение видимости элемента управления при обновлении свойства во ViewModel

К примеру, есть класс 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

Комментариев нет:

Отправить комментарий