首页 > 解决方案 > 是否可以在 Prism WPF 项目和 Prism Forms 之间使用通用视图模型(尤其是导航)?

问题描述

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

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

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

标签: wpfformsxamarinmvvmprism

解决方案


在浏览了 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 上宣传的一样。


推荐阅读