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

MVVM实践:在控件内公开viewmodel类,mvvm,viewmodel,Mvvm,Viewmodel,我对问题进行了编辑,以使我想得到的更清楚。 这是最初的问题: 我正在处理一个从控件继承的类,该类将在我的视图中使用,并包含一些依赖属性。 其中一个DPs是IEnumerable(RfidTag的),将绑定到VM内的observeCollection(RfidTag的)。 类RfidTag在VM类所在的同一文件中定义为公共类 问题是: 一,。将与VM相关的类公开给控制类是一种好做法吗? 2.VM源文件是RfidTag类的好位置吗 更新1 在我的应用程序逻辑中(我想我可以说在我的模型中),有一个通过

我对问题进行了编辑,以使我想得到的更清楚。 这是最初的问题:

我正在处理一个从控件继承的类,该类将在我的视图中使用,并包含一些依赖属性。
其中一个DPs是
IEnumerable(RfidTag的)
,将绑定到VM内的
observeCollection(RfidTag的)
。 类
RfidTag
在VM类所在的同一文件中定义为公共类

问题是:

一,。将与VM相关的类公开给控制类是一种好做法吗?
2.VM源文件是
RfidTag
类的好位置吗

更新1
在我的应用程序逻辑中(我想我可以说在我的模型中),有一个通过Eventaggregator发布的事件。事件的有效负载是
ModelRfidTag
(即模型类)的列表。
我的虚拟机订阅了这个事件,我创建了
RfidTag
类来包装我的模型类,并提供了一些仅与虚拟机相关的附加属性

当VM内的事件处理程序被执行时,它会使(RfidTag的)可从视图绑定。
然后在视图中,我有一个这样的控件实例反弹

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

然后在我的
RfidTagPresenter
(从控件继承的类)中,我有一个类型为
RfidTag
(称为
RfidTagResult
)的DP,它返回OC中具有
位置
属性的对象(属性在
RfidTag
类中可用)等于
TagPosition
DP设置的值。 通过这种方式,
RfidTagPresenter
的ControlTemplate可以将其元素绑定到所需的对象

这是我想做的事情的简化。在实际应用中,还有一些其他DPs在其上执行RfidTagResult选择

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

我将尝试详细讨论您的问题(如果我遗漏了什么,请告诉我),但首先您应该解释将控件中的
集合
绑定为DP的目的

将与VM相关的类公开给控制类是一种好的做法吗

RfidTag
,我想是一个
模型。这里真正要做的是在控件中绑定一个
模型
,这与
MVVM
模式背道而驰。你应该考虑下一个问题。。。您真的需要所有的
RfidTag
显示在
视图中吗?如果您需要显示名称、ID。。。您可以只创建一个
IEnumerable
作为DP(这是正确的),然后在
VM
中而不是
observedcollection
中创建一个
observedcollection

一些简单的理论。在
MVVM
中,
VM
模型
调整为
视图
。因此,您的
VM
应该拥有将在
视图中显示的所有内容

VM源文件是RfidTag类的好位置吗


RfidTag
是一个
模型,因此没有更好的地方可以放置它:)

根据定义,ViewModel是一个独立的类,与UI无关。因此,你应该考虑解决你所面临的情况。您有一个从ViewModel中的控件(依赖于UI)继承的类。根据定义,这是一种糟糕的做法。理论上,无论在.Ty Dominic上是WPF还是WinForms应用程序,您都应该能够再次使用viewmodels,但问题略有不同:也许我没有解释清楚:rfidtag类最初只是为VM创建的,用于表示集合中的项。然后我创建了一个控件,该控件将在视图中用于直观地表示对象。我创建了两个DPs,用于指定(通过xaml绑定)集合和整数索引。通过这种方式,我的控件可以对指定集合的指定索引进行操作。因此,现在必须在控件类中引用一个与VM相关的类(作为数据类型),因为我的控件需要知道列表项是如何生成的……换句话说,我的控件只能与这个特定的VM结合使用,因为其中一个DP是IEnumerable(属于RfidTag),RfidTag是在VM名称空间中定义的一个类。您可以发布如何创建DP吗?我看不出你是怎么申报的,sorry@Dominik如果这不是真的,那么他在VM中拥有的类不是从
控件继承的,它是一个“普通”类。在
控件
(s)中,他定义了该类的
IEnumerable
。Ty Juan Carlos Rodriguez。我编辑了我的问题以澄清我的问题