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
命名空间,自动解析,但是找不到DialogService
class,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;
}
}
应该是一个简单的答案,但我没看到。
MVVM Light v5 引入了 NavigationService 和 DialogService。我想制作一个示例应用程序来玩弄它们。建议似乎是我需要做的就是在 ViewModelLocator
中注册它们:
SimpleIoc.Default.Register<IDialogService, DialogService>();
IDialogService
需要Galasoft.MvvmLight.Views
命名空间,自动解析,但是找不到DialogService
class,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;
}
}