mvvm light - NavigationService / DialogService 类 未找到

mvvm light - NavigationService / DialogService classes not found

应该是一个简单的答案,但我没看到。

MVVM Light v5 引入了 NavigationService 和 DialogService。我想制作一个示例应用程序来玩弄它们。建议似乎是我需要做的就是在 ViewModelLocator 中注册它们:

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

IDialogService需要Galasoft.MvvmLight.Views命名空间,自动解析,但是找不到DialogServiceclass,VS无法推荐命名空间导入。

类似于 NavigationService

我假设您使用的是 WPF,在这种情况下没有 IDialogService 和 INavigationService 的默认实现。因此,您将需要创建自己的实现。

这是基于他的一些示例应用程序的代码...谢谢 Laurent,你太棒了!我花了一段时间才找到这个...希望这有帮助:)

DialogService 实现

/// <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 实现

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