中。应该的模型或模型的实施,举?
-
12-09-2019 - |
题
大多数例子。我曾经有了的 模型 实施举,但在 乔希*史密斯的CommandSink例 视图模型的实现,举.
我仍然认知能力放在一起的。概念,所以我不知道,如果:
- 你必须把举的模型得到CommandSink工作
- 这只是一个差的准则并不真正的问题
- 你应该总是有模型的实施,举而这仅仅是一个错误将得到纠正,如果这是发展的代码实例来应用程序
什么都被他人的经验项目。你有工作吗?
解决方案
我说恰恰相反,我总是把我 INotifyPropertyChanged
在我的视图模型的-你真的不想被污染模型与一个相当WPF的具体特点像 INotifyPropertyChanged
, 那东西应该坐在模型.
我肯定别人会不同意,但这是我的工作。
其他提示
我坚决不同意这一概念的模式不应该实现的 INotifyPropertyChanged
.这个界面不UI具体!它只是通知的变化。事实上,WPF大量使用这个标识的变化,但这并不意味着它是一个用户界面接口。我会把它比作如下评论:"一个轮胎是的汽车配件".肯定是这样,但自行车、公共汽车,等等。还使用它。 在摘要,不要采取这一界面为一个用户界面的事情。
有的说,它并不一定意味着,我认为,模型应提供通知。 事实上,作为一项规则的经验,该模式不应该实现这种接口,除非它是必要的。 在大多数情况下,那里没有服务器的数据被推到客户的应用程序,该模型可以是陈旧。但是,如果听到金融市场数据,然后我看不出为什么模式无法实现接口。作为一个例子,如果我有非UI逻辑诸如服务,当它接收到一个投标或要求的价格为一个赋予它的价值问题的警报(ex。通过电子邮件)或地方了?这可能是一个可能的干净的解决方案。
然而,有不同的方式实现的事情,但我总是认为有利于简单起见和避免的冗余。
什么是更好吗?定义事件在收集或财产上的变化视图模型和传播模型或具有查看本质模型更新(通过视图模型)?
底线每当你看到有人声称,"你不可以这样或那样的"它是一个标志,他们不知道他们是在谈论。
这真的取决于你的情况和事实。是一个框架,有很多问题我还没有看到一个共同的实施。。
我希望我有更多的时间来解释的许多种的。一些常见问题的解决方案--主要是提供通过其他开发,但我想我将要做的另一次。
在M-V-VM视图模型总是(型号不是总是)实现了举
检查了M-V-VM项目的模板/工具包,从 http://blogs.msdn.com/llobo/archive/2009/05/01/download-m-v-vm-project-template-toolkit.aspx.它使用 DelegateCommand
为指挥它应该是一个伟大的开始为你的模板M-V-VM项目。
我觉得。很不叫和叫视图模型的一个模型将导致许多错过一个重要特征的一个设计良好的建筑,这是一个DataController控制的数据不管是谁想要碰它。
如果你想的视图模型为更多的DataController和执行一个建筑在哪里你DataController是唯一的项目涉及到的数据,那么你将永远不会碰的直接数据,但始终使用DataController.该DataController是有用的用户界面但不一定是唯一的用户界面。这是对业务层,UI层,等等。
DataModel -------- DataController ------ View
/
Business --------/
你结束了一个模式是这样。即使是业务应该只触摸的数据使用的模型.然后你的难题就消失。
这取决于你如何已经实现了你的模型。我的公司使用的业务对象,类似于就里昂证券的目的和广泛使用的举在整个业务模式。
我们的验证的发动机在很大程度上依赖被通知,性质变化通过这一机制,它工作得很好。显然,如果您使用的是不同的执行以外的其他业务的对象中,通知的变化不是作为关键的操作时,你可能有其他方法,用于检测改变你的商业模式。
我们也必须视图模型,传播从模型在需要的地方,但视图模型本身正在收听的潜在模式的变化。
我同意保罗回答,执行 INotifyPropertyChanged
在模型是完全可接受的,甚至建议由Microsoft
通常,该模式实现的设施,使它容易 结合。这通常意味着它支持和财产 收集更改通知过
INotifyPropertyChanged
和INotifyCollectionChanged
接口。模型类代表 集合的对象通常来自ObservableCollection<T>
类,它提供了一个实现的INotifyCollectionChanged
接口。
虽然其由你来决定是否你想要的那种类型的执行情况或者没有,但是记住
如果你的模型类不实施所需的接口?
有时候你会需要的工作模型对象,不 实施
INotifyPropertyChanged
,INotifyCollectionChanged
,IDataErrorInfo
, 或INotifyDataErrorInfo
接口。在这些情况下, 视图模型可能需要包裹的模型对象和暴露的 所需属性的看法。这些属性的值会 被直接提供的模型对象。视图模型将 实施需要接口的性质它暴露了所以 视图可以很容易地数据结合到它们。
采取从- http://msdn.microsoft.com/en-us/library/gg405484(PandP.40).aspx
我曾在一些项目中,我们还没有实现 INotifyPropertyChanged
在我们的模型,由于这一点,我们面临的很多问题;不必要的重复性质,需要在虚拟机并在同一时间我们不得不到更新的基本目的(与更新值)才通过他们BL/DL。
你将面临的问题,特别是如果您需要的工作集合的模型的对象(说在一个可编辑的网格或列表)或复杂的模型;模型对象不会自动更新,并且你将不得不管理所有在您的虚拟机。
但有时候(如在此演讲 链接文本)模型服务,其提供应用程序的一些数据在网上,然后你需要emplement通知,新的数据或数据已经改变了使用事件...
我认为答案是很清楚如果你要坚持MV-虚拟机。
参见:http://msdn.microsoft.com/en-us/library/gg405484(v=PandP.40).aspx
在本。模式,查看封装和任何UI逻辑,视图模型的封装表示逻辑和态,模型封装的业务逻辑和数据。
"看相互作用的视图模型,通过数据结合, 命令,变更通知的事件。视图模型的查询, 观察,并协调更新型、转换、 验证和汇总数据所必需显示在图。"
我想说在你的视图模型.这不是模型的一部分为模型是UI无关。该模式应该是'以外的所有业务无关的'
我认为,这一切都取决于使用的情况。
当你有一个简单的模型的属性,可以有它的执行INPC.通过简单的我的意思是,这种模式看起来不像 POCO的.
如果你的模型更为复杂且生活在一个交互式模型域模型中引用的模型,订阅其他的模特的事件--具有模型的事件实现为INPC是一场噩梦。
把自己放在一个位置的某些型号的实体,具有colaborate与其他一些模型。你有各种各样的活动订阅。所有这些都是实现为INPC.想象这些事件的处理程序。一个巨大的瀑布,如果条款和/或开关clausses.
另一个问题INPC.你应该设计应用程序依赖于抽象,没有实现。这是通常使用的接口。
让我们看看2不同的实现的同样的抽象:
public class ConnectionStateChangedEventArgs : EventArgs
{
public bool IsConnected {get;set;}
}
interface IConnectionManagerINPC : INotifyPropertyChanged
{
string Name {get;}
int ConnectionsLimit {get;}
/*
A few more properties
*/
bool IsConnected {get;}
}
interface IConnectionManager
{
string Name {get;}
int ConnectionsLimit {get;}
/*
A few more properties
*/
event EventHandler<ConnectionStateChangedEventArgs> ConnectionStateChanged;
bool IsConnected {get;}
}
现在看看他们两个。什么IConnectionManagerINPC告诉你吗?这些属性可能会改变。你不知道他们。事实上,所设计的是,只有断电的变化,因为他们的休息是只读的。
在相反的,IConnectionManager的意图是清楚的:"我可以告诉你,我的断电财产的价值可能改变"。
只是使用 INotifyPropertyChange
在你的视图模型,而不是在模型,
该模式通常使用 IDataErrorInfo
到处理验证的错误,因此只要保持你的视图模型和你是对的你。道路。
假设参考的目的在你看来变化。你如何将通知所有特性进行更新,以便显示正确价值?叫 OnPropertyChanged
你认为所有目的性质是垃圾我的观点。
所以我要做的就是让的对象本身的通知任何人时,一个价值在财产变化,在我看我用绑定喜欢 Object.Property1
, Object.Property2
和上。在这一方式如果我只是想改变的对象是目前保持在我看我刚做的 OnPropertyChanged("Object")
.
为了避免数以百计的通知期间装载的对象,我有一个私布尔的指示,我设置了它真的在装载这是检查的对象 OnPropertyChanged
和什么都不做。
我用的 INotifyPropertyChange
接口在一个模型。实际上,模型的属性更改应该被解雇通过用户界面或外部客户只。
我注意到几个优点和缺点:
优点
通知是在业务模式
- 为每域的驱动,这是正确的。它应决定何时提出并且当不到。
缺点
该模型具有的性质(数量、速度,委员会totalfrieght).Totalfrieght计算使用数量、速度,委员会改变。
上装载的价值观从数据库,总frieght计算是所谓的3倍(数量、速度,委员会)。它应该是一次。
如果速,数量分配给在业务层,再次通知。
应该有一个选项禁用此,可能在基类。然而,开发商可能忘了做到这一点。
通常视图模型将会实现的 INotifyPropertyChanged
.模型可以是任何东西(xml文件、数据库或甚至对象)。使用模型得到的数据的模型,其中传播的景。
恕我直言我觉得模型的实现 INotifyPropertyChange
该模型可以使用的通知上不同的"水平"。
例如: 有一些文件服务和文件的对象,你有一个documentChanged事件,一视图模型听清除和重建。在编辑模型你有一个propertychange为的性质的文件,以支持的意见。如果服务不会很多与文件保存时(更新更改日期、最后用户和以上)你很容易得到一个超载的Ipropertychanged事件,只是一个documentchanged是不够的。
但是如果您使用 INotifyPropertyChange
在你的模型我觉得它是好的做法继电器的,它在你的视图模型中代之而起的订阅它直接在你的看法。在这种情况下,当事件改变模型中的你只需要改变模型和图保持不变。
所有属性,它们绑定要我看来,在我的视图模型(s)。因此,他们应实行举的接口。因此图获取所有的变化。
[使用。光的工具包,我让他们inherite从ViewModelBase.]
该模型拥有的商业逻辑,但没有与图。因此没有需要举的接口。
执行INPC在模型可以使用,如果该模式显然暴露出在模型.但一般来说,该模型包装的模型是他自己的课程,以减少模型的复杂性(这应该不会有用的结合)。在这种情况下INPC应该实施的视图模型.