2015-05-19 6 views
9

Sollte eine einfache Antwort sein, aber ich sehe es nicht.mvvm light - NavigationService/DialogService Klassen nicht gefunden

MVVM Light v5 führte einen NavigationService und DialogService ein. Ich wollte eine Beispielanwendung machen, um mit ihnen herumzuspielen. Der Rat scheint zu sein, dass alles, was ich tun muß, ist sie in den ViewModelLocator als solche registrieren:

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

Die IDialogService braucht die Galasoft.MvvmLight.Views Namespace, der automatisch aufgelöst wird, aber die DialogService Klasse nicht gefunden werden kann, und VS kann einen zu importierenden Namespace nicht empfehlen.

Ähnliche für NavigationService

Antwort

5

Ich nehme an, Sie WPF verwenden, wobei in diesem Fall kein Standardimplementierung von IDialogService und INavigationService ist. Daher müssen Sie Ihre eigenen Implementierungen erstellen.

+2

Das hat mich überrascht, würde ich gedacht habe WPF wäre der erste, der eine Standardimplementierung hätte. Kennst du irgendwo, dass ein Codebeispiel für einen Basisdienst für beide von diesen hat (so kann ich die Funktionalität sehen, die es implementieren muss) – SeeMoreGain

+0

Beantwortete meinen eigenen Kommentar. [Dieser Artikel] (http://www.c-sharpcorner.com/UploadFile/3789b7/modern-ui-for-wpf-application-by-example-navigationservice/) gibt mir genug, um damit zu arbeiten. – SeeMoreGain

6

Hier ist der Code auf einigen seiner Beispielanwendungen basiert ... Danke Laurent Rock! es dauerte eine Weile, dies zu finden ... hoffe, das hilft :)

DialogService Implementierung

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

Navigation Implementierung

/// <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; 
    } 
} 
Verwandte Themen