我已经编辑了问题,以使我想更清楚地了解。 这是原始问题:
我正在研究一个从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使用的类类型吗?
答案 0 :(得分:0)
我将尝试解决您的所有问题(如果我错过了让我知道的事情),但是首先您应该解释将Collection
绑定为控件作为DP的目的。
我想将与VM相关的类公开给Control类是一种好习惯吗?
RfidTag
是Model
。您在这里真正要做的是在控件中绑定Model
,这违反了MVVM
模式。您应该考虑下一个问题...您是否真的需要将所有RfidTag
显示在View
中?如果需要显示名称,ID ...,您可以将IEnumerable<string>
创建为DP(正确),然后在VM
中而不是ObservableCollection<RfidTag>
中创建ObservableCollection<string>
。
一些简单的理论。在MVVM
中,VM
使Model
适应View
。因此,您的VM
应该拥有将在View
中显示的所有内容。
VM源文件是RfidTag类的好地方吗?
RfidTag
是Model
,所以没有更好的地方了:)