如何在 C++ UWP 中共享视图模型?

How to share a view model in C++ UWP?

如何在 C++ UWP 应用程序中的不同页面之间共享视图模型?


是一个使用静态 属性:

的 C# 解决方案
public sealed partial class MainPage : Page
{
    public AppViewModel ViewModel { get; set; } = new AppViewModel();
    public static MainPage Current { get; set; }

    public MainPage()
    {
        this.InitializeComponent();
        Current = this;
    }
}

但我无法将其转换为 C++。

我的 C++ MainPage 目前看起来像这样:

namespace winrt::myproject::implementation
{
    struct MainPage : MainPageT<MainPage>
    {
        MainPage();

        myproject::MainViewModel MainViewModel() const { return this->mainViewModel; }

    private:
        myproject::MainViewModel mainViewModel{ nullptr };
    };
}

视图模型实例是在 MainPage() 构造函数中使用

创建的
this->mainViewModel = winrt::make<myproject::implementation::MainViewModel>();

.idl 文件只是将视图模型实例列为 属性:

[default_interface]
runtimeclass MainPage : Windows.UI.Xaml.Controls.Page
{
    MainPage();

    MainViewModel MainViewModel{ get; };
}

如何在我的所有页面之间共享 MainViewModel

myproject::MainViewModel最终派生自winrt::Windows::Foundation::IUnknown。正是这个结构实现了所有的引用计数机制,将每个派生类型变成一个指向其接口的共享指针。

下面的实现

myproject::MainViewModel MainViewModel() const { return this->mainViewModel; }

调用 IUnknown::IUnknown(IUnknown const& other) copy-c'tor 增加对 other 的引用计数并构造一个 IUnknown 实例持有相同的指针。 this->mainViewModel 和 return 值都指向同一个对象。

一般来说,复制表示投影类型的结构执行浅拷贝。仅复制指向对象的指针,并增加引用计数。与 std::shared_ptr 一样,该操作是线程安全的并且具有可比的开销。

可以在 Consume APIs with C++/WinRT.

中找到有关 投影类型 内部结构和使用的更多信息