我的具体问题是:如何将模型更改从模型传递到ViewModel?
在Josh的文章中,我没有看到他这样做.ViewModel始终向Model询问属性.在Rachel的例子中,她确实拥有模型实现INotifyPropertyChanged,并从模型中引发事件,但它们是供视图本身使用的(有关她为什么这样做的详细信息,请参阅她的文章/代码).
我在任何地方都看不到模型警告ViewModel模型属性更改的示例.这让我担心,也许是因为某些原因没有做到的. 是否有一种模式用于警告ViewModel模型中的更改? 这似乎是必要的,因为(1)可以想象每个模型有超过1个ViewModel,(2)即使只有一个ViewModel,模型上的某些操作可能会导致其他属性被更改.
我怀疑可能会有"你为什么要这样做?"的答案/评论.评论,所以这里是我的程序的描述.我是MVVM的新手,所以也许我的整个设计都有问题.我将简要介绍一下.
我编写的东西比"客户"或"产品"类更有趣(至少对我而言!).我在编程BlackJack.
我有一个View,后面没有任何代码,只依赖于绑定到ViewModel中的属性和命令(参见Josh Smith的文章).
是好还是坏,我把该模型应该不仅包含类,如态度PlayingCard,Deck但也BlackJackGame认为保持整场比赛的状态,并且知道当玩家已经破产,经销商必须抓牌,阶级和玩家和经销商当前得分是多少(少于21,21,胸围等).
从BlackJackGame我公开像"DrawCard"这样的方法,我发现在绘制卡片时CardScore,IsBust应该更新属性,例如和,并将这些新值传递给ViewModel.也许这是错误的思考?
人们可以采取ViewModel称之为DrawCard()方法的态度,因此他应该知道要求更新的分数并找出他是否破产.意见?
在我的ViewModel中,我有逻辑来获取扑克牌的实际图像(基于套装,等级)并使其可用于视图.该模型不应该与此有关(也许其他ViewModel只使用数字而不是扑克牌图像).当然,也许有些人会告诉我模型甚至不应该有BlackJack游戏的概念,而应该在ViewModel中处理?
在使用MVVM模式执行一些项目之后,我仍然在努力使用ViewModel的角色:
我过去做了什么:仅将模型用作数据容器.使逻辑操纵ViewModel中的数据.(这就是业务逻辑吗?)Con:逻辑不可重复使用.
我现在正在尝试:保持ViewModel尽可能薄.将所有逻辑移动到模型层.仅在ViewModel中保留演示逻辑.Con:如果在模型层内更改了数据,则会使UI通知真的很痛苦.
所以我会给你一个例子,让它更清晰:
场景:重命名文件的工具.类:文件:代表每个文件; 规则:包含逻辑如何重命名文件;
如果我遵循方法1:为文件,规则和视图创建ViewModel - > RenamerViewModel.将所有Logic放在RenamerViewModel中:包含FileViewModel和RuleViewModel的列表以及正在进行的逻辑.简单快速,但不可重复使用.
如果我遵循方法2:创建一个新的模型类 - >重命名,其中包含文件列表,规则和进行逻辑以对每个文件进行交互并应用每个规则.为文件,规则和重命名器创建视图模型.现在RenamerViewModel只包含一个Renamer Model的实例,加上两个ObservableCollections来包装Renamer的File和Rule List.但整个逻辑都在Renamer模型中.因此,如果触发重命名模型以通过方法调用操作某些数据,则ViewModel不知道哪些数据被操纵.因为模型不包含任何PropertyChange通知,我会避免这种情况.因此,业务和表示逻辑是分开的,但这使得很难通知用户界面.
说我有一个Person班级,一个PersonViewModel和一个PersonView.
将属性更新PersonView到Person模型很简单.PersonViewModel包含一个Person对象,并具有PersonView绑定到的公共属性,以便更新Person模型.
然而.
想象一下,Person模型可以更新Service.现在需要将属性更改传达给PersonViewModel然后再传递给PersonView.
我就是这样解决的:
对于Person模型中的每个属性,我将引发PropertyChanged事件.PersonViewModel订阅了PropertyChanged事件Person.PersonViewModel然后会引发另一个PropertyChanged以更新PersonView.
这对我来说似乎是最明显的方式,但我有点想把这个问题抛到那里,希望有人能给我一个更好的方法.这真的很简单,还是有更好的方法将模型标记为已修改并更新ViewModel上的相应属性?
该PersonView的DataContext的是PersonViewModel.Person从JSON填充并在其生命周期内多次更新.
随意为我的特定情况建议架构更改.
我将aqwert标记为我问题的答案,因为它为我提供了我已经提出的解决方案的替代方案.
我已经完成了一些MVVM教程,我已经看到了这两种方式.大多数人使用ViewModel for PropertyChanged(这是我一直在做的),但我遇到了一个在模型中做到这一点.两种方法都可以接受吗 如果是这样,不同方法的好处/缺点是什么?
我有一个遵循MVVM模式的WPF应用程序.到目前为止,应用程序定义了两个视图和视图模型
两个视图模型都需要从其他视图模型访问多个属性.
示例:
LoginViewModel有一个属性ProjectList.ProjectsViewModel也需要访问此属性.
这只是一个简单的例子.之后会有几个UserControls都需要互相交流.
创建一个所有UserControls(视图)设置为他们的巨大视图模型会更好DataContext吗?如果没有,所有不同的视图模型如何相互作用?
备注:
这个问题是密切相关的这一个,但有不同的方法.
我知道已经有关于该主题的问题,但其中的问题在某种程度上与其他问题有关,并没有提供确凿的答案.
特别是那里:问题1,问题2,当然还有问题3 所以请不要太快关闭这个问题.他们回答那里只是说"做这个,做那个"而不是为什么!
有些人否认需要a ViewModel并且说"标准"方式是直接绑定到模型.这是我否认并试图用技术论证来证明的.
从我在后台MVC,MVP,Presentation Model,它只是很自然地我使用ViewModel.也许我错过了一个重点?
所以对我来说,默认是绑定到a ViewModel,无论它Model是什么(无论它是否实现INotifyPropertyChanged).
我看到绑定到s的原因有几个ViewModel,包括(如此处提到的CodeProject和另一篇文章)
1.从视图中删除逻辑
2.安全
3.松耦合
4.发展速度
Prototype ViewModel层次结构开始并绑定到该层次结构Prototype ModelModel并且ViewModel可以开发testdriven,无论ViewView可完全由设计师,还是具有很强的设计背景开发商建5.解决了"棘手的同步"问题
6.整个项目的结构相同
7.可扩展性 …
我想构建一个基本的wpf/mvvm应用程序,它从具有WCF的服务器获取数据,并允许客户端显示/操作(使用CRUD操作)此数据.
到目前为止,我为这个架构考虑了类似的东西:
我对Views/ViewModel部分很清楚,但是我很难搞清楚模型,WCF和viewmodel之间的关系.
我的问题是:
欢迎任何其他有关此类架构的提示......
这是一个简单的问题,我在互联网上搜索了数小时却没有成功...
我有一个模型和一个具有一个属性的视图模型。为了使该属性在视图中可见,我使用了一个view-model-object,它应该从model-object自动生成,反之亦然。当然,以下代码将引发StackOverflowException,因为模型中模型对象的更新会导致视图模型中视图模型对象的更新,这会导致模型中模型对象的更新等等...
class ModelObject
{
...
}
class ViewModelObject
{
...
}
class Model : INotifyPropertyChanged
{
private ModelObject modelObject = new ModelObject();
...
public ModelObject ModelObject
{
get
{
return this.modelObject;
}
set
{
this.modelObject = value;
this.NotifyPropertyChanged("ModelObject");
}
}
}
class ViewModel : INotifyPropertyChanged
{
private ViewModelObject viewModelObject = new ViewModelObject();
private Model model = new Model();
...
public ViewModel()
{
this.model.PropertyChanged += new PropertyChangedEventHandler(this.propertyChangedEvent);
}
public ViewModelObject ViewModelObject
{
get
{
return this.viewModelObject;
}
set
{
this.viewModelObject …Run Code Online (Sandbox Code Playgroud) mvvm ×8
c# ×6
wpf ×5
.net ×1
architecture ×1
binding ×1
model ×1
prism ×1
properties ×1
silverlight ×1
synchronize ×1
view ×1
viewmodel ×1
wcf ×1