2010-10-25 2 views
6

Я использую свойство Binding IsAsync, чтобы поддерживать пользовательский интерфейс и загружать данные из get accessor свойства и оказался хорошим вариантом при использовании MVVM. Этот подход замечательный и не требует никакого ручного кода для асинхронных операций. Есть несколько случаев, когда мой dataload занимает несколько секунд, и за это время очень сложно различать «нет данных» и «загрузку данных». Есть ли свойство, которое я могу обнаружить состояние привязки «IsBusy» или «Загрузка», чтобы я мог показать сообщение о том, что операция загрузки не завершена?WPF binding isAsync Get State

Любая помощь приветствуется.

ответ

7

According to the docs,

Ожидая значение, чтобы прибыть, связывающие докладывает FallbackValue, если таковой имеется, или значение по умолчанию связывания целевого свойства.

Вы можете использовать это значение, чтобы отображать сообщение пользователю во время загрузки связывания.

+0

Спасибо, что ... Попробуем найти способ привязать его либо через viewmodel, и/или xaml к всплывающему окну «Ожидание» .. обеспечивают огромный уровень простоты с помощью модели приложения WPF-MVVM. Однако .. похоже, нет простого способа добиться этого. – Bhuvan

+0

@Bhuvan: У вас также может быть общедоступное свойство enum, которое предоставляет текущее состояние виртуальной машины ... Инициализировано, загружается, готово. Затем вы можете привязываться к этому в пользовательском интерфейсе и показывать пользователю все, что захотите, во время этих состояний ... – Will

17

Я знаю, его старая нить. Но если кто-то еще интересно ...

Вы можете использовать PriorityBinding, есть великолепно объяснил пример в этой статье: http://www.switchonthecode.com/tutorials/wpf-tutorial-priority-bindings

Идея заключается в том, чтобы оговорить PriorityBinding, который в свою очередь, определяет несколько регулярных привязок, как это :

<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"> 
    <TextBlock.Text> 
     <PriorityBinding> 
     <Binding ElementName="MainWindow" Path="Slow" IsAsync="True" /> 
     <Binding ElementName="MainWindow" Path="Fast" /> 
     </PriorityBinding> 
    </TextBlock.Text> 
    </TextBlock> 

Порядок привязок определяет приоритет с наивысшим приоритетом. В этом случае Fast binding (самый низкий приоритет) будет сразу заполнять текстовый блок, потому что у вас может быть связанная с строковым свойством «Загрузка ...» или «Сортировка ...» в зависимости от того, что происходит в то время, и есть без задержки.

Но позже, когда свойство медленной привязки async возвращает значение, это более высокий приоритет означает, что он будет принят, поскольку он ранее в списке, и его результаты будут привязаны вместо этого, показывая фактические результаты.

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