Как узнать, когда анимация закончилась в моей ViewModel? - PullRequest
1 голос
/ 20 февраля 2012

Я ищу свойство зависимости, которое может сказать мне, когда анимация закончилась.Я показываю вспышку (изменение фона), когда значение изменяется, устанавливая свойство «IsDirty», чтобы позволить View знать, что оно должно анимировать фон, но затем мне нужно сбросить значение для следующего изменения.

Я надеюсь, вы понимаете, о чем я.

РЕДАКТИРОВАТЬ: Для отображения вспышки я использую раскадровку.

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Вы можете обработать событие Completed для StoryBoard и установить любые уведомления в этот момент времени.Я понимаю, что вы хотели избежать кода позади, но я думаю, что он потребуется в этом случае, потому что в StoryBoard нет такого свойства зависимости для "IsComplete", с которым вы могли бы связать данные.

0 голосов
/ 20 февраля 2012

Вы не должны, и не должны.

Модель представления не должна иметь представления о представлении *, не говоря уже о том, когда представление завершило выполнение анимации. Для ВМ абсолютно нормально иметь свойство IsDirty, что с этим делает представление, и ВМ не нужно об этом знать. Однако вы должны проверить использование этого флага - общее использование означает, что данные находятся в измененном и несохраненном состоянии, когда анимация пользовательского интерфейса завершила работу, виртуальная машина все еще находится в грязном состоянии, поэтому вы не должны использовать этот флаг для переключения анимации при каждом изменении данных (вместо этого используйте обычное событие PropertyChanged ).

Edit:
Вот еще несколько уточнений в ответ на комментарий.

IsDirty означает, что пользователь должен быть уведомлен об изменении.

Существует множество способов уведомить пользователя об изменении данных. Это может быть одноразовое событие, например значок в области состояния, флэш-интерфейс и т. Д. Флаг IsDirty должен сбрасываться только виртуальной машиной, поскольку виртуальная машина знает, когда измененные данные были сохранены. Представление дает вам кнопку (или что-то еще) для запуска механизма сохранения, оно фактически не знает, когда (или было ли) данные действительно были сохранены, поэтому следует, что представление не должно сбрасывать этот флаг. Вам не нужно, чтобы представление показывало, что уведомление завершено - вы можете отключить кнопки сохранения или другие элементы пользовательского интерфейса во время анимации, чтобы предотвратить взаимодействие пользователя с данными.

Если вы хотите уведомлять каждый каждый раз, когда данные изменяются, а затем реализовать интерфейс INotifyPropertyChanged, как упомянуто выше, вы можете выставить событие PropertyChanged через интерфейс на ВМ, тогда представление может подписаться на и вы можете запустить анимацию для любых изменений свойств, которые вас интересуют. Вам нужно быть осторожным, чтобы ограничить скорость - вы не хотите сходить с ума от анимации в ответ на быстрые изменения свойств.

* Мне еще предстоит увидеть действительное использование виртуальной машины, которая знает и может манипулировать представлением и реагировать на него. Многие люди делают это, но это просто плохой дизайн, который заставляет их использовать этот подход.

...