Как реализовать диалог с / без обратной связи в приложении wpf 4.0 с помощью MVVM Light

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

Спасибо, Зафар


person Zafar    schedule 03.04.2013    source источник
comment
Что вы имеете в виду под нарушением MVVM?   -  person DHN    schedule 03.04.2013
comment
Это с наименьшим количеством кода и возможностью повторного использования.   -  person Zafar    schedule 03.04.2013
comment
Можете быть более конкретными? Вы хотите обмениваться данными (ошибками) от представления к модели, слабо связанной? Тогда курс обмена сообщениями - это то, что вам нужно.   -  person Marius    schedule 03.04.2013
comment
Мне нужно какое-то окно Coustomizable Message с некоторыми предопределенными функциями для отображения сообщения в формате MVVM, чтобы я мог получить доступ к этим окнам сообщений из любой моей модели просмотра.   -  person Zafar    schedule 03.04.2013


Ответы (2)


Ссылаясь на ваш комментарий, я настоятельно рекомендую вам внимательно изучить Messenger class. Он даже предоставляет GalaSoft.MvvmLight.Messaging. DialogMessage для этого. Но вы можете предоставить свои собственные подклассы GenericMessage<T>

Вы регистрируетесь для получения такого сообщения и определяете, что должно произойти по прибытии сообщения:

Messenger.Default.Register<DialogMessage>(this,
    dm =>
    {
        MessageBox.Show(dm.Content, dm.Caption, dm.Button, dm.Icon);
    });

Хотя существует только удержание WeakReference, я обычно отменяю регистрацию, если больше не хочу получать информацию или представление отбрасывается. Всегда будь хорошим гражданином;)

Messenger.Default.Unregister(this);

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

Messenger.Default.Send(new DialogMessage(this, "Content",
    result => Console.WriteLine(result.ToString()))
    {
        Caption = "Caption"
        Icon = MessageBoxImage.Asterisk,
        Button = MessageBoxButton.OK
    });
person Marius    schedule 03.04.2013
comment
Используя тот же подход, можно отобразить настраиваемый диалог, но это добавит некоторой сложности. - person User1551892; 08.04.2013

Чтобы обрабатывать любые диалоги в шаблоне mvvm, вы должны использовать своего рода Dialog-Service. В этом сообщении вы найдете несколько советов по использованию этого подхода.

Помещение диалогового материала в службу сохраняет шаблон mvvm нетронутым. Сервис берет на себя все создание диалогов и может предоставить результаты. Модель представления просто вызывает методы и подписывается на события, предоставляемые службой.

Хороший способ решить вашу проблему таким образом - использовать Шаблоны взаимодействия с пользователем.

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

Существует два распространенных подхода к реализации таких взаимодействий с пользователем в шаблоне MVVM. Один из подходов - реализовать службу, которая может использоваться моделью представления для инициирования взаимодействия с пользователем, тем самым сохраняя свою независимость от реализации представления. Другой подход использует события, вызванные моделью представления, чтобы выразить намерение взаимодействовать с пользователем, а также компоненты в представлении, которые привязаны к этим событиям и управляют визуальными аспектами взаимодействия.

Это шаблон MVVM для выполнения DialogServices и т. Д., Поэтому он также соответствует вашим требованиям.

person Batuu    schedule 03.04.2013