2015-05-19 10 views
9

Dovrebbe essere una risposta semplice, ma non la vedo.mvvm light - Classi NavigationService/DialogService non trovati

MVVM Light v5 ha introdotto NavigationService e DialogService. Volevo creare un'applicazione di esempio per giocare con loro. Il consiglio sembra essere che tutti ho bisogno di fare è registrarsi al ViewModelLocator in quanto tale:

SimpleIoc.Default.Register<IDialogService, DialogService>();

Il IDialogService ha bisogno dello spazio dei nomi Galasoft.MvvmLight.Views, che viene risolto automaticamente, ma la classe DialogService non può essere trovato, e VS non posso raccomandare un namespace da importare.

Simile per NavigationService

risposta

5

Sto assumendo che si sta utilizzando WPF, nel qual caso non c'è un implementazione di default di IDialogService e INavigationService. Quindi dovrai creare le tue implementazioni.

+2

che mi sorprende, mi avrebbe mai pensato che WPF sarebbe il primo ad avere un'implementazione predefinita. Sei a conoscenza di dovunque abbia un codice di esempio per un servizio di base per entrambi (quindi posso vedere la funzionalità che dovrà implementare) – SeeMoreGain

+0

Ho risposto al mio commento. [Questo articolo] (http://www.c-sharpcorner.com/UploadFile/3789b7/modern-ui-for-wpf-application-by-example-navigationservice/) mi dà abbastanza per lavorare. – SeeMoreGain

6

Ecco il codice basato su alcune delle sue applicazioni di esempio ... grazie Laurent u rock! mi c'è voluto un po 'per trovare questo ... speriamo che questo aiuta :)

DialogService Attuazione

/// <summary> 
/// Example from Laurent Bugnions Flowers.Forms mvvm Examples 
/// </summary> 
public class DialogService : IDialogService 
{ 
    private Page _dialogPage; 

    public void Initialize(Page dialogPage) 
    { 
     _dialogPage = dialogPage; 
    } 

    public async Task ShowError(string message, 
     string title, 
     string buttonText, 
     Action afterHideCallback) 
    { 
     await _dialogPage.DisplayAlert(
      title, 
      message, 
      buttonText); 

     if (afterHideCallback != null) 
     { 
      afterHideCallback(); 
     } 
    } 

    public async Task ShowError(
     Exception error, 
     string title, 
     string buttonText, 
     Action afterHideCallback) 
    { 
     await _dialogPage.DisplayAlert(
      title, 
      error.Message, 
      buttonText); 

     if (afterHideCallback != null) 
     { 
      afterHideCallback(); 
     } 
    } 

    public async Task ShowMessage(
     string message, 
     string title) 
    { 
     await _dialogPage.DisplayAlert(
      title, 
      message, 
      "OK"); 
    } 

    public async Task ShowMessage(
     string message, 
     string title, 
     string buttonText, 
     Action afterHideCallback) 
    { 
     await _dialogPage.DisplayAlert(
      title, 
      message, 
      buttonText); 

     if (afterHideCallback != null) 
     { 
      afterHideCallback(); 
     } 
    } 

    public async Task<bool> ShowMessage(
     string message, 
     string title, 
     string buttonConfirmText, 
     string buttonCancelText, 
     Action<bool> afterHideCallback) 
    { 
     var result = await _dialogPage.DisplayAlert(
      title, 
      message, 
      buttonConfirmText, 
      buttonCancelText); 

     if (afterHideCallback != null) 
     { 
      afterHideCallback(result); 
     } 

     return result; 
    } 

    public async Task ShowMessageBox(
     string message, 
     string title) 
    { 
     await _dialogPage.DisplayAlert(
      title, 
      message, 
      "OK"); 
    } 
} 

NavigationService Attuazione

/// <summary> 
/// Example from Laurent Bugnions Flowers.Forms mvvm Examples 
/// </summary> 
public class NavigationService : INavigationService 
{ 
    private readonly Dictionary<string, Type> _pagesByKey = new Dictionary<string, Type>(); 
    private NavigationPage _navigation; 

    public string CurrentPageKey 
    { 
     get 
     { 
      lock (_pagesByKey) 
      { 
       if (_navigation.CurrentPage == null) 
       { 
        return null; 
       } 

       var pageType = _navigation.CurrentPage.GetType(); 

       return _pagesByKey.ContainsValue(pageType) 
        ? _pagesByKey.First(p => p.Value == pageType).Key 
        : null; 
      } 
     } 
    } 

    public void GoBack() 
    { 
     _navigation.PopAsync(); 
    } 

    public void NavigateTo(string pageKey) 
    { 
     NavigateTo(pageKey, null); 
    } 

    public void NavigateTo(string pageKey, object parameter) 
    { 
     lock (_pagesByKey) 
     { 
      if (_pagesByKey.ContainsKey(pageKey)) 
      { 
       var type = _pagesByKey[pageKey]; 
       ConstructorInfo constructor = null; 
       object[] parameters = null; 

       if (parameter == null) 
       { 
        constructor = type.GetTypeInfo() 
         .DeclaredConstructors 
         .FirstOrDefault(c => !c.GetParameters().Any()); 

        parameters = new object[] 
        { 
        }; 
       } 
       else 
       { 
        constructor = type.GetTypeInfo() 
         .DeclaredConstructors 
         .FirstOrDefault(
          c => 
          { 
           var p = c.GetParameters(); 
           return p.Count() == 1 
             && p[0].ParameterType == parameter.GetType(); 
          }); 

        parameters = new[] 
        { 
         parameter 
        }; 
       } 

       if (constructor == null) 
       { 
        throw new InvalidOperationException(
         "No suitable constructor found for page " + pageKey); 
       } 

       var page = constructor.Invoke(parameters) as Page; 
       _navigation.PushAsync(page); 
      } 
      else 
      { 
       throw new ArgumentException(
        string.Format(
         "No such page: {0}. Did you forget to call NavigationService.Configure?", 
         pageKey), 
        "pageKey"); 
      } 
     } 
    } 

    public void Configure(string pageKey, Type pageType) 
    { 
     lock (_pagesByKey) 
     { 
      if (_pagesByKey.ContainsKey(pageKey)) 
      { 
       _pagesByKey[pageKey] = pageType; 
      } 
      else 
      { 
       _pagesByKey.Add(pageKey, pageType); 
      } 
     } 
    } 

    public void Initialize(NavigationPage navigation) 
    { 
     _navigation = navigation; 
    } 
} 
Problemi correlati