IEnumerable <IResult>- калиброванный микро - PullRequest
2 голосов
/ 31 декабря 2010

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

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

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

            _activeChatScreens.Add(nick, chatScreen);

            yield return chatScreen;
        }
    }

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

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

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

Но не открывается новое окно.Возможно ли решить эту проблему?Мне нужно использовать метод OpenChatScreen в другом методе typeof 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.

Ответы [ 2 ]

5 голосов
/ 01 января 2011

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

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

0 голосов
/ 23 мая 2012

Вы можете создать метод расширения для выполнения сопрограмм для всех методов, которые возвращает 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);
        }
    }
...