Лучший способ реализовать временные наложения в MVVM

Я пишу приложение, которое подключается к сетевым ресурсам.

Когда приложение подключается, я хочу отобразить всплывающее окно с обычным графиком прогресса спинни и кнопкой отмены. Я разработал ConnectProgressViewModel и соответствующий ConnectProgressView для наложения.

Мой вопрос: каков самый чистый способ показать / скрыть оверлей из родительской ViewModel?

A) Выставьте константу ConnectProgressViewModel из моей родительской ViewModel и пусть ConnectProgressView привяжет ее видимость к свойству ConnectProgressViewModel.IsConnecting.

B) Предоставьте универсальное свойство Overlay из родительской ViewModel и установите для него ConnectProgressViewModel, когда пользователь хочет подключиться. Родительское представление связывает ContentControl с этим свойством Overlay, а шаблон данных берет на себя все остальное.

В)?

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

Второе, кажется, лучше подходит для MVVM, поскольку ConnectProgressViewModel создается только тогда, когда это необходимо, но он добавляет больше функциональности родительскому объекту, а также общее свойство Overlay выглядит немного странно.

Ваше здоровье

РЕДАКТИРОВАТЬ:

Я должен пояснить, что это представление не только показывает статус занятости. Это позволяет отменять / повторять попытки, выбирать различные сетевые ресурсы и т. Д. Я опустил такие детали для краткости, что, возможно, было ошибкой, поскольку люди концентрируются на индикаторе занятости.


person GazTheDestroyer    schedule 13.01.2012    source источник


Ответы (2)


Я всегда просто использую BusyIndicator из Silverlight Toolkit. У него нет кнопки отмены, но вы, вероятно, можете стилизовать ее так, чтобы она была. BusyIndicator имеет свойство IsBusy, которое я привязываю к свойству IsBusy в моей ViewModel. Если вы стилизуете элемент управления так, чтобы он имел кнопку, вы можете добавить команду отмены в свою ViewModel.

Изменить

Я только что увидел, что это WPF, а не Silverlight. Я не уверен, есть ли в WPF Toolkit BusyIndicator

Изменить снова

Похоже, что в Extended WPF Toolkit есть BusyIndicator. Заметьте, у меня нет опыта в этом.

person cadrell0    schedule 13.01.2012
comment
BusyIndicator автоматически отображается, когда IsBusy имеет значение true, и скрывается, когда IsBusy имеет значение false. - person cadrell0; 13.01.2012
comment
Да, только что взглянул на версию WPF Toolkit, спасибо. Кажется, что он там все время и показывает / прячется, как мой A). - person GazTheDestroyer; 13.01.2012

Я бы пошел с чем-то вроде вашего предложения в A) и утверждал, что вам не следует реализовывать что-то столь же общее, как B), пока у вас действительно не будет требуемой степени гибкости, например, возможности отображать различные виды наложения.

Будь проще!

person granaker    schedule 13.01.2012