IEnumerable <iresult> - caliburn micro </iresult>

时间:2010-12-31 16:03:05

标签: wpf ienumerable 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);
}

但它没有打开新窗口。有可能解决这个问题吗?我需要在其他方法typeof void中使用OpenChatScreen方法,如果有可能,我想打开新窗口。谢谢你的帮助。

to codekaizen:

我试试这个:

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 *

我不知道如何在void方法中使用OpenChatScreen方法。

2 个答案:

答案 0 :(得分:5)

它的协程。就其本身而言,它无法运行它。您需要执行使用Caliburn.Micro:Coroutine.Execute(OpenChatScreen().GetEnumerator())

此外,尝试在官方Caliburn.Micro论坛上搜索或询问: http://caliburnmicro.codeplex.com/Thread/View.aspx?ThreadId=231822

答案 1 :(得分:0)

您可以创建一个扩展方法来为所有返回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>

视图模型:

    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);
        }
    }