Windows phone 8 使用带有可移植类库和MVVM指示灯的MessageDialog/MessageBox

Windows phone 8 使用带有可移植类库和MVVM指示灯的MessageDialog/MessageBox,windows-phone-8,windows-store-apps,mvvm-light,portable-class-library,Windows Phone 8,Windows Store Apps,Mvvm Light,Portable Class Library,我正在开发一款适用于Windows Phone 8和Windows应用商店的应用程序。为了减少冗余,我使用了一个可移植类库(PCL),除此之外,我还尝试在MVVM Light PCL工具包的帮助下应用MVVM模式。ViewModels放置在PCL中,并直接绑定在应用程序页面的XAML中 当数据接收无误时,一切正常。但我不知道当错误发生时如何将异常/错误消息返回到应用程序 Windows应用商店应用程序内部的错误将显示为MessageDialog,而Wp8应用程序将使用MessageBox类。显然

我正在开发一款适用于Windows Phone 8和Windows应用商店的应用程序。为了减少冗余,我使用了一个可移植类库(PCL),除此之外,我还尝试在MVVM Light PCL工具包的帮助下应用MVVM模式。ViewModels放置在PCL中,并直接绑定在应用程序页面的XAML中

当数据接收无误时,一切正常。但我不知道当错误发生时如何将异常/错误消息返回到应用程序

Windows应用商店应用程序内部的错误将显示为MessageDialog,而Wp8应用程序将使用MessageBox类。显然,PCL不知道这些类别中的任何一个。我没有得到的是如何知道ViewModel是否出错,以及如何在应用程序中获取消息。当ViewModels绑定在XAML中时,这是否可能

视图模型(PCL内部)中的代码如下所示:

DataService.Authenticate((token, error) =>
{
    if (error != null)
    {
        // This is, obviously, not going to work.
        MessageBox.Show(error.Message);
        return;
        }

    Token = token;
});

因此,我必须以某种方式保存错误,并让应用程序本身知道错误已经发生,然后调用向用户显示错误的匹配方式

目前,我正在考虑在BaseViewModel中定义错误属性,并在ViewModel中出现错误时填充它。然后,在页面的代码隐藏中,让他们知道当前的ViewModel,并将PropertyChanged事件绑定到此错误属性。但我还没能实现它,所以我不知道这是否是正确的方法


我是否必须放弃在XAML中绑定ViewModels的想法,而是必须在Codebehind页面中初始化它们?

你的直觉是正确的,但实现这一点的方法不止这些

首先,您可以使用Mvvm的消息传递库,它将允许您的
ViewModel
将消息直接发送到您的视图。然后,您的视图可以按其希望的任何方式处理它,包括但不限于使用
MessageDialog

其次,您还可以在
ViewModelLocator
中为
ShowMessageDialog
创建函数或操作(可能是前者)。此函数可能会接受一个
字符串
,并返回一个
任务
。然后,在初始化
ViewModelLocator
之后,可以插入
ShowMessageDialog
代码。然后,您的
ViewModels
可以使用任何平台的
消息对话框

例:

注意:此代码使用Nuget中可访问的BCL异步库。他们在PCL工作很好

ViewModelLocator:

public static Func<string, Task> ShowMessageDialog { get; set; }
视图模型:

await ViewModelLocator.ShowMessageDialog("This is my message.");
第二个注释:
md.ShowAsync().AsTask()必须在UI线程上运行。这意味着您必须在异步运行任务时通过调度程序调用它。这可以使用类似的方法,通过RunAsync方法注入应用程序的CoreDispatcher的使用

这意味着您可以在任何平台(上面显示的Windows 8和Windows Phone)上,插入您想要的任何消息对话框系统,并在PCL中使用它


我想说的是,使用我建议的第一种方法要容易得多,因为这就是它的用途,但函数方法版本有时确实很有用。

谢谢,这很有帮助。我当前的实现现在使用PCL内部的设置、消息传递等接口。然后,在W8/WP8项目中,我为他们的平台实现它们,并将它们自动注入到我的ViewModelBase中。不过,我会看看MVVM Lights消息传递。在第一次快速查看之后,可能缺少了使用WP8 MessageBoxButton之类的平台细节的可能性,但我可能缺少了一些东西。
await ViewModelLocator.ShowMessageDialog("This is my message.");