相关疑难解决方法(0)

WPF中的MVVM - 如何提醒ViewModel模型中的更改...还是应该?

我正在阅读一些MVVM文章,主要是这个这个.

我的具体问题是:如何将模型更改从模型传递到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中处理?

.net c# wpf mvvm

105
推荐指数
4
解决办法
9万
查看次数

MVVM: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通知,我会避免这种情况.因此,业务和表示逻辑是分开的,但这使得很难通知用户界面.

c# wpf design-patterns mvvm

42
推荐指数
3
解决办法
3万
查看次数

MVVM:修改模型,如何正确更新ViewModel和View?

案件

说我有一个Person班级,一个PersonViewModel和一个PersonView.

将属性更新PersonViewPerson模型很简单.PersonViewModel包含一个Person对象,并具有PersonView绑定到的公共属性,以便更新Person模型.

然而.

想象一下,Person模型可以更新Service.现在需要将属性更改传达给PersonViewModel然后再传递给PersonView.

我就是这样解决的:

对于Person模型中的每个属性,我将引发PropertyChanged事件.PersonViewModel订阅了PropertyChanged事件Person.PersonViewModel然后会引发另一个PropertyChanged以更新PersonView.

这对我来说似乎是最明显的方式,但我有点想把这个问题抛到那里,希望有人能给我一个更好的方法.这真的很简单,还是有更好的方法将模型标记为已修改并更新ViewModel上的相应属性?

附加

PersonView的DataContext的是PersonViewModel.Person从JSON填充并在其生命周期内多次更新.

随意为我的特定情况建议架构更改.

回答

我将aqwert标记为我问题的答案,因为它为我提供了我已经提出的解决方案的替代方案.

c# silverlight domain-driven-design prism mvvm

27
推荐指数
2
解决办法
3万
查看次数

MVVM - Model或ViewModel中的PropertyChanged?

我已经完成了一些MVVM教程,我已经看到了这两种方式.大多数人使用ViewModel for PropertyChanged(这是我一直在做的),但我遇到了一个在模型中做到这一点.两种方法都可以接受吗 如果是这样,不同方法的好处/缺点是什么?

c# mvvm

19
推荐指数
3
解决办法
2万
查看次数

MVVM中视图模型的交互

我有一个遵循MVVM模式的WPF应用程序.到目前为止,应用程序定义了两个视图和视图模型

  • LoginView(型号)
  • ProjectsView(型号)

两个视图模型都需要从其他视图模型访问多个属性.

示例:
LoginViewModel有一个属性ProjectList.ProjectsViewModel也需要访问此属性.

这只是一个简单的例子.之后会有几个UserControls都需要互相交流.

创建一个所有UserControls(视图)设置为他们的巨大视图模型会更好DataContext吗?如果没有,所有不同的视图模型如何相互作用?

备注:
这个问题是密切相关的这一个,但有不同的方法.

wpf properties mvvm viewmodel

14
推荐指数
2
解决办法
1万
查看次数

绑定到Model或ViewModel

我知道已经有关于该主题的问题,但其中的问题在某种程度上与其他问题有关,并没有提供确凿的答案.

特别是那里:问题1,问题2,当然还有问题3 所以请不要太快关闭这个问题.他们回答那里只是说"做这个,做那个"而不是为什么!

有些人否认需要a ViewModel并且说"标准"方式是直接绑定到模型.这是我否认并试图用技术论证来证明的.

从我在后台MVC,MVP,Presentation Model,它只是很自然地我使用ViewModel.也许我错过了一个重点?

所以对我来说,默认是绑定到a ViewModel,无论它Model是什么(无论它是否实现INotifyPropertyChanged).

我看到绑定到s的原因几个ViewModel,包括(如此处提到的CodeProject另一篇文章)

1.从视图中删除逻辑

  • 使逻辑单元可测试
  • 减少代码冗余(在需要时复制)

2.安全

  • 该模型包含用户不得更改的属性
  • 如果绑定到模型,则会发生自动但不需要的更新

3.松耦合

  • 如果直接绑定到模型,则较低层和View之间将存在耦合
  • 更改模型会导致所有视图中的更改
  • 视图不依赖于任何给定的模型
  • 可以使用EF,某些DSL,批处理文件等轻松生成模型

4.发展速度

  • 您可以从Prototype ViewModel层次结构开始并绑定到该层次结构
  • 如果模型仍在开发中,您可以从a开始 Prototype Model
  • Model并且ViewModel可以开发testdriven,无论View
  • View可完全由设计师,还是具有很强的设计背景开发商建

5.解决了"棘手的同步"问题

  • 对于任何给定的"棘手同步"问题,有很多解决方案,例如
  • AutoMapper
  • 来自模型的事件系统(模型触发事件,ViewModel订阅)

6.整个项目的结构相同

  • 有一些点需要ViewModel,比如SelectedItem
  • 将Binding与Model和ViewModel混合是错误的
  • 新鲜的开发人员很难弄清楚项目的结构
  • 稍后开始带ViewModel时,无法绕过它是凌乱的

7.可扩展性 …

c# wpf binding mvvm

8
推荐指数
2
解决办法
2645
查看次数

WPF MVVM WCF客户端/服务器体系结构

我想构建一个基本的wpf/mvvm应用程序,它从具有WCF的服务器获取数据,并允许客户端显示/操作(使用CRUD操作)此数据.

到目前为止,我为这个架构考虑了类似的东西:

  • "全局"模型层,实现验证,研究标准,INotifyPropertyChanged和服务合同
  • 一些服务层,主要是一个用于实体框架4,实现模型层的契约,允许我访问和操作数据.
  • 请注意,我想要一个离线数据源,比如XML或其他东西,因此另一个服务(我计划使用一些DI/IoC)
  • WCF层
  • 数据存储客户端的额外层?
  • ViewModel

我对Views/ViewModel部分很清楚,但是我很难搞清楚模型,WCF和viewmodel之间的关系.

我的问题是:

  1. 我该如何处理EF生成的模型?摆脱它并采用代码优先方法,手动与数据库进行映射?
  2. 对于WCF数据传输,我的模型中是否应该有关系属性,即Product有Customer而不是CustomerId?
  3. 我应该在WCF和ViewModel之间有一个额外的层来存储和操作数据,还是将ViewModel直接插入WCF的最佳做法?

欢迎任何其他有关此类架构的提示......

architecture wpf wcf mvvm

5
推荐指数
1
解决办法
8341
查看次数

如何在MVVM中双向同步模型和视图模型?

这是一个简单的问题,我在互联网上搜索了数小时却没有成功...

我有一个模型和一个具有一个属性的视图模型。为了使该属性在视图中可见,我使用了一个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)

c# model view mvvm synchronize

2
推荐指数
1
解决办法
3937
查看次数