IEnumerable‹IResult› - caliburn micro

Я использую этот метод в модели просмотра при открытии нового окна:

    public IEnumerable<IResult> OpenChatScreen()
    {
        if (!_activeChatScreens.ContainsKey(nick))
        {

            var chatScreen = new ShowWindow("ChatScreen")
                .InitializeWith(_service.DetailData(nick));

            _activeChatScreens.Add(nick, chatScreen);

            yield return chatScreen;
        }
    }

Этот метод, например, привязывается к кнопке.

Я пытаюсь использовать этот метод в другом методе void. Что-то вроде этого:

public void SomeMethod(string nick)
{
  OpenChatScreen(nick);
}

Но не открывает новое окно. Возможно ли решить эту проблему? Мне нужно использовать метод OpenChatScreen в другом методе типа void, и я хотел бы открыть новое окно, если это возможно. Спасибо за помощь.

К кодекайдзен:

Я пробую это:

public void SomeMethod(string nick)
{
 new IResult[] { OpenChatScreen(nick) };
}

Я получаю эту ошибку:

* Ошибка 2. Не удается неявно преобразовать тип «System.Collections.Generic.IEnumerable» в «Caliburn.Micro.IResult». Существует явное преобразование (вам не хватает приведения?) C:\Users\Jan\Documents\Visual Studio 2010\Projects\C#\Pokec_Messenger\ver.beta\Pokec__Messenger\Spirit_Caliburn_Micro_v1.1\ViewModels\MessengerViewModel.cs 314 45 Spirit_Caliburn_Micro_v1. 1*

Итак, я пытаюсь привести к IResult:

                        var w = OpenChatScreen(rp.Nick) as IResult;

                        new IResult[] { w };

ошибка:

*Ошибка 1 В качестве оператора можно использовать только выражения присваивания, вызова, увеличения, уменьшения и нового объекта C:\Users\Jan\Documents\Visual Studio 2010\Projects\C#\Pokec_Messenger\ver.beta\Pokec__Messenger\Spirit_Caliburn_Micro_v1.1 \ViewModels\MessengerViewModel.cs 314 29 Spirit_Caliburn_Micro_v1.1*

Я понятия не имею, как использовать метод OpenChatScreen в методе void.


person Community    schedule 31.12.2010    source источник


Ответы (2)


Это корутина. Само по себе запустить его невозможно. Вам нужно выполнить это с помощью Caliburn.Micro: Coroutine.Execute(OpenChatScreen().GetEnumerator())

Кроме того, попробуйте выполнить поиск или задать вопрос на официальном форуме Caliburn.Micro: http://caliburnmicro.codeplex.com/Thread/View.aspx?ThreadId=231822

person Euphoric    schedule 01.01.2011

Вы можете создать метод расширения для выполнения сопрограмм для всех методов, которые возвращают IEnumerable:

    public static void AsCoroutine(this IEnumerable<IResult> routine, EventHandler<ResultCompletionEventArgs> callBack = null)
    {
        if (routine != null)
            Coroutine.BeginExecute(routine.GetEnumerator(), null, callBack);
    }

Затем вы можете использовать этот метод:

XAML-разметка:

    <UserControl>
        <Menu Grid.Row="0">
        <MenuItem Header="File">
            <MenuItem Header="About" x:Name="ShowHome" />
                </MenuItem>
            </Menu>
    </UserControl>

ViewModel:

    public void ShowHome()
    {
        ShowScreen(IoC.Get<IHome>()).AsCoroutine();
    }


    public IEnumerable<IResult> ShowScreen(object parameter)
    {
        if (parameter is RoutedEventArgs)
        {
            var menuItem = (FrameworkElement)((RoutedEventArgs)parameter).OriginalSource;
            if (menuItem != null && menuItem.Tag != null)
                yield return BusyResult.Start(() => GetScreen(menuItem.Tag.ToString()));
            else yield break;
        }
        else if (parameter is IScreen)
        {
            ActivateItem((IScreen)parameter);
        }
    }
person Jone Polvora    schedule 22.05.2012