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

时间:2012-11-05 07:07:37

标签: visual-c++ windows-8 windows-runtime c++-cx

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

public ref class ViewModelBase {
    ...
}

public ref class OtherViewModel : ViewModelBase {
    ...
}

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

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

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

错误C3213:基类“MyNamespace :: ViewModelBase”的访问权限低于“OtherViewModel”

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

2 个答案:

答案 0 :(得分:5)

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

如果您想拥有所有视图模型的基类,那么您唯一的选择就是将所有类设为私有或继承自Windows::UI::Xaml的基类(例如DependencyObject)。< / p>

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

  • 使用DependencyObject作为基础使得所有的viewmodel STA对象(因此它们只能从UI线程中操作)除了有很多非必要的开销之外。
  • 将您的类设为私有意味着您无法使用[Bindable]属性进行数据绑定,因此您需要拥有私有数据绑定实现。 (您的私人课程需要实现ICustomPropertyProvider及相关接口。)

答案 1 :(得分:-1)

“sealed”关键字表示无法继承该类。您的实现应该如下所示:

ref class ViewModelBase sealed

如果你想从ViewModelBase继承,那么你只需要像这样的子类是ref类:

class ViewModelBase

...

public ref class OtherViewModel sealed : ViewModelBase