截至2016年10月,仍然是Microsoft身份验证库(MSAL - NuGet包:Microsoft.Identity.Client)是与Xamarin(iOS/Android)和Azure AD B2C服务一起使用的正确/唯一库吗?此库(MSAL)仅作为alpha提供,并且似乎不处于主动维护或开发状态(自4月以来).
有迹象表明,Active Directory身份验证库(ADAL - NuGet包:Microsoft.IdentityModel.Clients.ActiveDirectory)旨在作为Microsoft的"一个Azure身份验证库 - 规则 - 所有人",它支持Xamarin; 它也在积极维护,并且不处于"alpha"或"beta"状态.
了解Microsoft过去曾指出Azure AD B2C开发人员使用MSAL库,是否可以使用ADAL库在Xamarin应用程序中验证Azure AD B2C用户?是否有人可以指向我的博客或示例代码,这将演示如何执行此操作?
在 Xamarin.Forms 中,可以ViewModel通过<ContentPage.BindingContext>标记指定要与标记内的 XAML 页面一起使用的。我可以看到这样做的唯一优势 - 与 Prism.Forms 将视图绑定到ViewModels 的更灵活的方法- 然后我在添加属性值时在 XAML 中获得有关 VM 属性/命令的智能感知{Binding}。
同样,Prism.Forms 有更好的方法来绑定视图和ViewModels,但是当我使用它们时,我通常不会在 XAML 页面中获得IntelliSense——这实际上对复杂的 View/ViewModel 很有帮助。
我看不出有什么理由不能<ContentPage.BindingContext>在 Prism.Forms 场景中使用该标签。但是,就像我觉得很“破”是棱镜想要做的方式View-到-ViewModel绑定。
此外,我担心我的ViewModel将被不必要地实例化两次,一次是在 Xamarin.Forms 创建它时;还有一次当 Prism 进行绑定时。不确定这是否正确......此外,我可以看到一个场景,我想ViewModel在不同时间将我的视图绑定到不同的s;例如,Android 和 iOS 的不同 VM 类。Prism 允许我这样做,但我担心这不会与<ContentPage.BindingContext>存在的标签一起使用。
是否有一种支持/推荐的方法可以ViewModel在我的 XAML 中仅出于设计时的目的(即用于智能感知)来识别 my ,但 Prism 的视图到视图模型绑定逻辑发生在运行时?我想我希望<ContentPage.BindingContext>标签被完全忽略,除非我在 Visual Studio 中编辑 XAML。
编辑:我上面的问题不正确,因为我期望看到的 XAML View IntelliSense不是由 …
当我尝试从我的应用程序发送电子邮件时,我正在解决Prism.Forms(v6.2.0)和Xamarin Messaging Plugin(Xam.Plugins.Messaging v3.2.1)之间的冲突.
以下代码 - 从我的一个ViewModel执行:
using Plugin.Messaging;
if (MessagingPlugin.EmailMessenger.CanSendEmail)
{
var email = new EmailMessageBuilder()
.To("test@testemail.com")
.Subject("Email subject here!")
.Body("Dear friend,\nI would like to say...\n\n\n")
.Build();
MessagingPlugin.EmailMessenger.SendEmail(email);
}
Run Code Online (Sandbox Code Playgroud)
产生此错误 - 待发送的电子邮件永远不会显示在屏幕上:
警告:尝试在<Xamarin_Forms_Platform_iOS_PageRenderer:0x107de67c0>上显示<MFMailComposeViewController:0x108fb4400>,其视图不在窗口层次结构中!
我相信这是因为Messaging插件的iOS特定部分有一个.GetVisibleViewController()方法,它查找具有可见视图的UIViewController以显示要发送的电子邮件; 它正在寻找iOS不喜欢的视图控制器.
我想指出,我有几乎相同的代码(如上所示)在没有问题的情况下运行没有问题的MVVM模式的Xamarin.Forms应用程序不使用Prism.Forms [编辑:Brian L.指出下面这个问题是可能不是由棱镜引起的,我倾向于同意他的看法; 它更可能与两个应用程序之间的"导航流程"的微小差异有关,即使电子邮件构建/发送代码是相同的].当该MessagingPlugin.EmailMessenger.SendEmail(email);行执行时,屏幕上会弹出一封电子邮件,其中包含收件人,主题和正文; 并使用发送或取消按钮.这在非Prism Xamarin.Forms应用程序中工作正常.
所以,我已经解决了这个问题,足以使.SendEmail(email)方法调用正常工作.我必须将我的XF页面(即我的viewmodel的视图)传递给iOS特定的项目代码以调用.CreateViewController()它.我使用这个新的UIViewController作为其RootViewController创建一个UIWindow,然后创建该窗口.MakeKeyAndVisible().我已经调整了Xam.Plugins.Messaging的代码,让我传入一个UIViewController来使用.在之后.SendEmail(email)的方法调用发生时,我处理我的新创建的UIWindow; 这样在发送或取消电子邮件后我就看不到了.
这一切都有效,并允许我按预期使用Messaging插件的电子邮件发送功能.
我唯一剩下的问题是导航调用我的原始ViewModel的navigationService实例(即使用上面的代码尝试发送电子邮件的ViewModel)在发送电子邮件后都失败了.发送电子邮件后,我的view/viewmodel上的其他功能正常工作; 但是调用navigationService.GoBackAsync()或navigationService.NavigateAsync()失败并产生一个熟悉的错误:
警告:尝试在<Xamarin_Forms_Platform_iOS_PlatformRenderer:0x133df9640>上显示<Xamarin_Forms_Platform_iOS_ModalWrapper:0x1359c21a0>,其视图不在窗口层次结构中!
我相信我想做的是重置我的Prism NavigationService(视图)堆栈,使用类似的东西(Xamarin.Forms的代码,没有Prism):
Navigation.InsertPageBefore(new HomePage(), Navigation.NavigationStack.First());
Navigation.PopToRootAsync(true);
Run Code Online (Sandbox Code Playgroud)
但我没有看到使用Prism NavigationService进行"导航堆栈更改操作"的方法.但也许其他人呢?
提前致谢...