2010-12-31 7 views
2

ich diese Methode im Hinblick Modell verwenden, um auf neues Fenster zu öffnen: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; 
     } 
    } 

Diese Methode ist zum Beispiel binden auf diese Schaltfläche.

Ich versuche diese Methode in anderen Void-Methode verwenden. Etwas wie dieses:

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

Aber es öffnet kein neues Fenster. Es ist möglich, dieses Problem zu lösen? Ich brauche OpenChatScreen-Methode in anderen Methode typeof void und ich möchte ein neues Fenster öffnen, wenn es möglich ist. Danke für die Hilfe.

Um codekaizen:

Ich versuche dies:

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

ich diesen Fehler:

* Fehler 2 kann nicht implizit Typ umwandeln 'System.Collections.Generic.IEnumerable' zu "Caliburn.Micro.IResult". Es gibt eine explizite Konvertierung (fehlt eine Umwandlung?) C: \ Benutzer \ Jan \ Dokumente \ Visual Studio 2010 \ Projekte \ C# \ Pokec_Messenger \ ver.beta \ Pokec__Messenger \ Spirit_Caliburn_Micro_v1.1 \ ViewModels \ MessengerViewModel.cs 314 45 Spirit_Caliburn_Micro_v1. 1 *

Also versuche ich zu iResult Stimmen:

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

         new IResult[] { w }; 

Fehler:

* Fehler 1 Nur Zuordnung, Anruf, Erhöhung, Senkung und neue Objekt Ausdrücke können als Aussage C verwendet werden: \ Benutzer \ Jan \ Dokumente \ Visual Studio 2010 \ Projekte \ C# \ Pokec_Messenger \ ver.beta \ Pokec__Messenger \ Spirit_Caliburn_Micro_v1.1 \ ViewModels \ MessengerViewModel.cs 314 29 Spirit_Caliburn_Micro_v1.1 *

Ich habe keine Ahnung, wie die OpenChatScreen-Methode in der void-Methode verwendet wird.

Antwort

0

Sie eine Erweiterungsmethode erstellen kann Koroutinen für alle Methoden thant kehrt IEnumerable auszuführen:

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

Dann können Sie diese Methode verbrauchen:

XAML Markup:

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

Ansichtsmodell:

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