MVVM实践:在控件内部公开viewmodel类

时间:2018-09-05 15:58:15

标签: mvvm viewmodel

我已经编辑了问题,以使我想更清楚地了解。 这是原始问题:

我正在研究一个从Control继承的类,该类将在我的View中使用,并且包含一些依赖项属性。
这些DP之一是IEnumerable(Of RfidTag),并将绑定到VM内部的ObservableCollection(Of RfidTag)。 在虚拟机类所在的同一文件中,类RfidTag被定义为公共类。

问题是:

1。将与VM相关的类公开给Control类是一种好习惯吗?
2。 VM源文件是RfidTag类的好地方吗?

更新1
在我的应用程序逻辑中(我想我可以在模型中说),有一个事件是通过Eventaggregator发布的。事件的有效负载是ModelRfidTag的列表(即模型类)。
我的VM订阅了此事件,我制作了RfidTag类来包装Model类,并提供了一些仅与VM相关的其他属性。

在执行VM内部的事件处理程序时,它将使ObservableCollection(Of RfidTag)从视图可绑定。
然后,在“视图”中,我像这样的控件实例就束手无策

<c:RfidTagPresenter 
TagPosition="1"
Collection="{Binding RfidTagList, Mode=OneWay}" />

然后在我的RfidTagPresenter(继承自Control的类)中,我有一个类型为RfidTag(称为RfidTagResult)的DP,它在OC中返回具有{ {1}}属性(在Position类中可用的属性)等于RfidTag DP设置的值。 这样,TagPosition的ControlTemplate可以将其元素绑定到所需的对象。

这是我要制作的东西的简化。在实际应用中,还有其他一些DP可以在其上执行RfidTagResult选择

更新2
经过一些研究,似乎我可以使用索引属性解决一个问题,该属性从get绑定的对象中返回(在get方法中)对象。 但是仍然存在一个问题:我的控件需要具有RfidTag类型的DP,以便相对的ControlTemplate可以绑定到RfidTag类中声明的属性。 因此:是否有可能(请参阅:一种好作法)拥有与VM相关的类类型的DP? 换句话说:自定义控件可以知道VM使用的类类型吗?

1 个答案:

答案 0 :(得分:0)

我将尝试解决您的所有问题(如果我错过了让我知道的事情),但是首先您应该解释将Collection绑定为控件作为DP的目的。

  

将与VM相关的类公开给Control类是一种好习惯吗?

我想

RfidTagModel。您在这里真正要做的是在控件中绑定Model,这违反了MVVM模式。您应该考虑下一个问题...您是否真的需要将所有RfidTag显示在View中?如果需要显示名称,ID ...,您可以将IEnumerable<string>创建为DP(正确),然后在VM中而不是ObservableCollection<RfidTag>中创建ObservableCollection<string>

一些简单的理论。在MVVM中,VM使Model适应View。因此,您的VM应该拥有将在View中显示的所有内容。

  

VM源文件是RfidTag类的好地方吗?

RfidTagModel,所以没有更好的地方了:)