Xaml c++/CX
在编写C++/CX代码(打算绑定到XAML)时,以下模式不断出现:Xaml c++/CX,xaml,visual-c++,c++-cx,Xaml,Visual C++,C++ Cx,在编写C++/CX代码(打算绑定到XAML)时,以下模式不断出现: public ref class NoteViewModel sealed { public: property NoteList^ List { NoteList^ get() { if ( !_List ) { _List = ref new NoteList(); }
public ref class NoteViewModel sealed
{
public:
property NoteList^ List
{
NoteList^ get()
{
if ( !_List )
{
_List = ref new NoteList();
}
return _List;
}
}
private:
NoteList^ _List;
};
不仅必须为成员NoteList^\u List
使用句柄,还需要属性和get()以实现“绑定兼容性”。一个很好的特性是,如果发生get(),将自动构造\u List
问题1:没有hats和ref new,有没有更简单的设置方法
问题2:如果必须这样做,是否有一种聪明的(模板)方法来减少冗长 关于问题1,在ViewModel上创建的属性并不总是有备份存储。特别是对于只读属性,它可能只是检查基础模型或嵌入对象上的值的结果,或者只是viewmodel上其他属性的组合。但你经常需要一个后备商店
这就引出了问题#2:我没有看到一个好的基于模板的解决方案,因为一般来说,由于WinRT规则,任何具有模板类型的东西都不能公开。我见过使用C宏生成公共属性模式的模式,其中它是一个带有后备存储的简单getter/setter,通常是INotifyPropertyChanged的实现。假设a 标准C++类模板和WRET组件的{^,REF NeX}语法/语义将完全不兼容。(即,标准C++的定义当然没有专有/CX组件扩展。)所以没有希望。 假设B 组件扩展中的泛型不会起到帮助作用,因为支持存储成员数据是私有的,并且无法将名称作为标识符传递以用作样板文件(例如,在您的示例中,{List,{u List})。泛型不是宏,即使被概念化为mixin接口 假设C 这使得C宏成为剩下的潜在解决方案,尽管它们已经过时了。使用宏实际上有两种方法:
#define CX_PROPERTY( TYPE_CX_, IDENTIFIER_ ) \
public: property TYPE_CX_ ^ IDENTIFIER_ \
{ \
TYPE_CX_ ^ get() \
{ \
if( !_##IDENTIFIER_ ) \
_##IDENTIFIER_ = ref new TYPEC_CX(); \
return _##IDENTIFIER; \
} \
} \
private: TYPE_CX ^ _##IDENTIFIER_;
然后将其展开为:
public ref class NoteViewModel sealed
{
CX_PROPERTY( NoteList, List )
}
解决方案C.2
public ref class NoteViewModel sealed
{
# define TEMPLATE_PARAM_CX_TYPE NoteList
# define TEMPLATE_PARAM_IDENTIFIER List
# include <cxProperty.TEMPLATE.def>
{;
顺便说一句,绝对不要将#pragma one或老式的#if/#ifdef头多个包含保护放入cxProperty.TEMPLATE.def,因为您实际上希望多次包含此文件,在同一cxperty.TEMPLATE.def文件的每个包含处生成不同的属性
#if !defined TEMPLATE_PARAM_CX_TYPE
# error "You forgot to #define TEMPLATE_PARAM_CX_TYPE"
#endif
#if !defined TEMPLATE_PARAM_IDENTIFIER
# error "You forgot to #define TEMPLATE_PARAM_IDENTIFIER
#endif
public: property TEMPLATE_PARAM_CX_TYPE ^ TEMPLATE_PARAM_IDENTIFIER
{
TEMPLATE_PARAM_CX_TYPE ^ get()
{
if( !_##TEMPLATE_PARAM_IDENTIFIER )
_##TEMPLATE_PARAM_IDENTIFIER = ref new TEMPLATE_PARAM_CX_TYPE();
return _##TEMPLATE_PARAM_IDENTIFIER;
}
}
private: TEMPLATE_PARAM_CX_TYPE ^ _##TEMPLATE_PARAM_IDENTIFIER;
#undef TEMPLATE_PARAM_CX_TYPE
#undef TEMPLATE_PARAM_IDENTIFIER