如何在 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
?
我需要在 .idl
和 .h
文件中更改什么?
我是否需要使用 std::shared_ptr<myproject::MainViewModel>
或 winrt::comptr<myproject::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
一样,该操作是线程安全的并且具有可比的开销。
中找到有关 投影类型 内部结构和使用的更多信息
如何在 C++ UWP 应用程序中的不同页面之间共享视图模型?
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
?
我需要在
.idl
和.h
文件中更改什么?我是否需要使用
std::shared_ptr<myproject::MainViewModel>
或winrt::comptr<myproject::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
一样,该操作是线程安全的并且具有可比的开销。