2011-01-26 5 views
2

У меня довольно распространенная ситуация в моем пользовательском интерфейсе Silverlight, где видимость различных элементов связана с каким-то свойством в ViewModel. Например, я могу иметь контроль, как это:Как предотвратить появление мерцания в представлениях Silverlight?

<myapp:WarningView Visibility="{Binding IsInWarningState}" /> 

Если состояние предупреждения верно, мы хотим показать контроль, если нет, то мы не делаем. Проблема в том, что у меня много ситуаций, когда страница отображает и отображает весь контент, в том числе элемент управления WarningView, а затем второй позже скрывает представление, которое выглядит действительно неуклюжим.

Я думаю, что происходит то, что View загружает и делает асинхронный вызов на сервер для получения данных, но до тех пор, пока это не произойдет, нет никакого DataContext, и поэтому ничего, с помощью которого WarningView не связывается и не использует значения по умолчанию, и default - показать элемент управления.

Похоже, что для просмотра требуется создать экземпляр собственной модели просмотра или, по крайней мере, это то, что я сейчас делаю. А так как вызов асинхронный, всегда может быть некоторый интервал, когда вы хотите что-то показывать, но у вас пока нет реальных данных. Я мог бы представить себе макет ViewModel с лучшими настройками по умолчанию, но это похоже на большую работу по созданию проекта.

Итак, каков наилучший способ решения этой проблемы?

+0

Включает ли IsInWarningState значение true или false в вашей виртуальной машине? –

+0

False, поэтому элемент управления должен быть скрыт, и он * скрыт, когда VM загружается, но до тех пор это видно, что и вызывает мерцание. –

+0

Почему вы ожидаете завершения асинхронного вызова на виртуальной машине? Можете ли вы указать код для свойства IsInWarningState. Как вы прикрепляете ViewModel к представлению? –

ответ

4

Ну, долго после того, как я отказался от этого, я сам наткнулся на ответ: в привязке вы можете указать FallbackValue и/или TargetNullValue, которые определяют значение, которое нужно использовать, когда вещь, t быть полученным или равным нулю. Моя проблема заключалась в том, что View загружает и создает ViewModel, а в тот момент, когда вид виден и когда привязка завершена, элементы управления видны, а затем привязка сжимает их, и это вызывает мерцание. Установив значения Fallback, я могу убедиться, что элементы управления скомпилированы, а затем включится только при привязке, а затем они остаются включенными. Нет мерцания.

+0

+1 Спасибо за тонну! Я чувствую, что искал это годами! '' FallbackValue' сделал трюк. Если бы я знал это раньше. Почему я единственный, кто поддержал это? –

+0

Вы очень желанны. Я бы также подумал, что это обычная ситуация, с которой люди столкнулись бы, но, я думаю, нет, поскольку вопрос не имеет большого количества взглядов, и никто не ответил на него. Поэтому, возможно, никто другой не столкнулся с проблемой. Трудно поверить, но это так. –

Смежные вопросы