Xaml c++/CX

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(); }

在编写C++/CX代码(打算绑定到XAML)时,以下模式不断出现:

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宏成为剩下的潜在解决方案,尽管它们已经过时了。使用宏实际上有两种方法:

  • 将要展开的代码放在宏中,取上面提到的 标识符作为宏的参数

  • 将要展开的代码放在一个文件中#定义前面提到的 键入和标识符作为要传递到文件中的宏,然后#包括 那个档案

  • 解决方案C.1:

    #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