Преобразование асинхронного в синхронный вызов в потоке пользовательского интерфейса - PullRequest
1 голос
/ 29 июля 2011

Я пытаюсь реализовать шаблон проектирования IView для MVVM, который позволяет ViewModel взаимодействовать с пользователем, используя реализованный класс IView. Интерфейс IView имеет такие функции, как Prompt, Alert & Confirm. У меня есть три реализации интерфейса IView: CommandLineInteraction, WPFInteraction и TelerikInteraction. Первые два схожи по поведению (то есть они синхронны). Третий работает асинхронно.

Я хочу, чтобы TelerikInteraction работал синхронно. Это означает, что код, следующий за вызовом RadWindow.Confirm () или RadWindow.Prompt (), должен ждать, пока пользователь не будет взаимодействовать.

Ниже приведен фрагмент кода всех трех реализаций:

    //CommandLine Implementation
    public CustomConfirmResult Confirm(string message) {
        Console.WriteLine(message);
        Console.WriteLine("[Y]es    [N]o");
        string s = Console.ReadLine();

        if(s == y || s == Y)
            return CustomConfirmResult.Yes;
        else
            return CustomConfirmResult.No;
    }

    //Windows Implementation
    public CustomConfirmResult Confirm(string message) {
        MessageBoxResult mbr = MessageBox.Show(message, "", MessageBoxButton.OKCancel);

        if(mbr == MessageBoxResult.OK)
            return CustomConfirmResult.Yes;
        else
            return CustomConfirmResult.No;
    }

    //Telerik Implementation
    public CustomConfirmResult Confirm(string message) {
        CustomConfirmResult result;

        RadWindow.Confirm(new DialogParameters{
            Content=message,
            Closed = (o1, e1) =>{
                if(e1.DialogResult == true)
                    result = CustomConfirmResult.Yes;
                else
                    result = CustomConfirmResult.No;
            }
        });

        return result; //Executed before user interacts with the confirm dialog
    }

Как мне сделать эти реализации похожими по поведению?

Спасибо

Сунил Кумар

1 Ответ

1 голос
/ 29 июля 2011

Silverlight предназначен для асинхронной работы. Попытка заставить его работать синхронно ограничит отзывчивость вашего продукта.

Вместо этого следует прекратить использование MessageBox и перейти на полностью асинхронную модель кодирования.

Наличие вспомогательных методов, которые принимают делегаты или действия onCancel и onConfirm (или onYes, onNo или все, что вы предпочитаете) - это самый простой способ кодировать ситуацию типа вопрос и ответ , к которой вы стремитесь.

...