1

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

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

在 Windows Store App 中,错误将显示为 MessageDialog,而 Wp8 App 将使用 MessageBox 类。显然 PCL 不知道这些类中的任何一个。我没有得到的是如何知道 ViewModel 是否遇到错误,以及如何在 App 中获取消息。当 ViewModel 绑定在 XAML 中时,这甚至可能吗?

ViewModel (PCL 内部)中的代码如下所示:

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

    Token = token;
});

所以我必须以某种方式保存错误让App本身知道错误已经发生,然后调用匹配方式向用户显示错误。

目前我正在考虑在 BaseViewModel 中定义一个错误属性,并在 ViewModel 中发生错误时填充它。然后,在页面的 CodeBehind 中,让它们知道当前的 ViewModel 并将 PropertyChanged-event 绑定到此 Error-property。但是我还不能实现它,所以我不知道这是否是正确的方法。

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

4

1 回答 1

0

你的直觉是正确的,但是有很多方法可以解决这个问题。

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

其次,您还可以在 for 中创建一个 Function 或 Action(可能是前者ViewModelLocatorShowMessageDialog。此函数可能会采用 astring并返回 a Task。然后,在初始化您的ViewModelLocator初始之后,您可以注入您的ShowMessageDialog代码。然后,您ViewModels可以使用MessageDialogs他们喜欢的任何平台。

前任:

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

视图模型定位器:

public static Func<string, Task> ShowMessageDialog { get; set; }

应用程序.xaml.cs:

ViewModelLocator.ShowMessageDialog = (message) => 
    {
        // For Windows Phone
        return TaskFactory.StartNew(() => MessageBox.Show(message));

        // For Windows 8
        MessageDialog md = new MessageDialog(message);
        return md.ShowAsync().AsTask();
    };

视图模型:

await ViewModelLocator.ShowMessageDialog("This is my message.");

次要注意:md.ShowAsync().AsTask(); 必须在 UI Thread 上运行。这意味着如果您在任务中异步运行它,则必须通过调度程序调用它。这可以使用通过 RunAsync 方法注入应用程序的 CoreDispatcher 使用的类似方法来实现。

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

我会说执行我建议的第一种方法要容易得多,因为这就是它的用途,但 Function 方法版本有时肯定会有所帮助。

于 2013-07-25T20:43:18.087 回答