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。我编辑了我的问题以澄清我的问题