Страницы

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

среда, 4 марта 2020 г.

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

#c_sharp #wpf #mvvm #события


К примеру, есть класс User. Есть ViewModel, в которой есть свойство LastUser. Свойство
периодически обновляется, генерируя NotifyPropertyChanged. На форме, поверх остальных
элементов, лежит невидимая панель. При обновлении свойства, необходимо показать панель
на несколько секунд, а затем спрятать. Как можно реализовать такое поведение? Есть
ли какой-нибудь EventTriger или DataTrigger?
    


Ответы

Ответ 1



Наиболее простым видится вынести в 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

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

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