如何使用WinRT类创建公共视图模型库?

Bre*_*aut 2 visual-c++ windows-8 windows-runtime c++-cx

我想为我的所有视图模型创建一个抽象基类,但是我遇到了可访问性问题,似乎无法浏览错误.这是我的代码示例:

public ref class ViewModelBase {
    ...
}

public ref class OtherViewModel : ViewModelBase {
    ...
}
Run Code Online (Sandbox Code Playgroud)

当我将代码定义为上面的状态时,我收到以下错误:

错误C4585:'MyNamespace :: ViewModelBase':WinRT'公共引用类'必须被密封或从现有的未密封类派生

相反,如果我将ViewModelBase设为私有,则会出现此错误:

错误C3213:基类'MyNamespace :: ViewModelBase'比'OtherViewModel'更难访问

这看起来应该非常简单.我究竟做错了什么?

And*_*ich 5

在C++/CX中,您所尝试的内容并不严格,因为在VS 2012中,C++/CX不支持通用方案的公共类继承.仅支持XAML场景才能工作; 唯一可能的公开未密封类型是在Windows::UI::Xaml命名空间下找到的类型,用户无法创建自己的公开未密封类型.

如果您希望为所有视图模型都有一个基类,那么您唯一的选择就是将所有类设为私有或从基类继承Windows::UI::Xaml(例如DependencyObject).

这些方法中的每一种都有缺点:

  • 使用DependencyObject作为基础使得所有viewmodel STA对象(因此它们只能从UI线程中操作)除了具有非常必要的大量开销之外.
  • 使您的类私有意味着您不能使用该[Bindable]属性进行数据绑定,因此您需要具有私有数据绑定实现.(您的私有类需要实现ICustomPropertyProvider和相关的接口.)

  • 是的,这个限制出现在产品周期的后期,并应Windows运营团队的要求,他们希望保留未来版本的功能(通用运行时类继承),当我们有更多的设计更加连贯的时候故事.所有语言预测都有这种限制,但在C#中不那么痛苦,因为运行时反射允许它们支持私有类的数据绑定. (2认同)