是否可以在 Prism WPF 项目和 Prism Forms(特别是导航)之间使用通用视图模型?

Is it possible to use a common view model between a Prism WPF project and Prism Forms (particularly with navigation)?

我正在开发一个跨平台应用程序,并且正在为某些平台使用 Prism Forms,为 Windows 使用 Prism WPF。我想在两者之间使用一个通用的视图模型,但是我 运行 遇到了视图模型派生的基础 类 的挑战,尤其是导航支持。

我看到的 Prism Forms 示例实现了 INavigationAware。 Prism WPF 似乎也支持这一点。但是,我无法从同一个项目中同时引用 Prism WPF 和 Prism Forms,原因很明显,因为对两者中实现的类型的引用不明确。

我能够抽象出一个基本的导航界面,用于在页面之间导航,但我不确定如何创建在 Prism Forms 和 Prism WPF 项目中都能正常工作的 INavigationAware 的通用实现。

浏览 Prism.Core 的源代码后,我找到了一个合适的解决方法:IActiveAware(请参阅下面的参考资料)

/// <summary>
/// Interface that defines if the object instance is active
/// and notifies when the activity changes.
/// </summary>
public interface IActiveAware
{
    /// <summary>
    /// Gets or sets a value indicating whether the object is active.
    /// </summary>
    /// <value><see langword="true" /> if the object is active; otherwise <see langword="false" />.</value>
    bool IsActive { get; set; }

    /// <summary>
    /// Notifies that the value for <see cref="IsActive"/> property has changed.
    /// </summary>
    event EventHandler IsActiveChanged;
}

由于 INavigationAware 是一个需要由视图模型实现的接口,因此共享视图模型组件需要引用 Prism.Forms 和 Prism.WPF。这不起作用,因为它会导致对在两者中实现的 API 的引用不明确。

最初的目标是让视图模型在导航至或导航自时接收通知。 IActiveAware 解决了这个问题,并且因为它是在 Prism.Core 中实现的,所以可以从共享视图模型中使用。

我在 Prism 8 上确认该界面在 Prism Forms 和 Prism WPF 上都像宣传的那样工作。