我是MVVM的新手,正在尝试建立良好实践,因为我转换了一个大型的非Model-View WinForms项目。这是我实施的解决方案的一个例子。我想知道是否有更好的模式来解决这类问题。
MyModel有十个属性。 MyView公开其中两个供用户更新。 MyViewModel处理两者之间的常见内容。
其他模型依赖于MyModel的属性,因此我只想在提交值时更改MyModel。 MyView有OK和Cancel按钮,因此当用户与MyView交互时,我没有让MyViewModel直接更新MyModel,而是创建了另一个层:MyTempModel。 MyTempModel包含两个属性,对应于MyModel中的两个。
所以在MyModel中,提示代码看起来像这样:
var tempModel = new TempModel{Prop1=Prop1,Prop2=Prop2};
bool? response = new MyView().ShowDialog();
if (response.HasValue && response.Value)
{
Prop1 = tempModel.Prop1
Prop2 = tempModel.Prop2
}
因此,如果用户单击“取消”,则不会更改MyModel的属性。 注意:这里没有显示我在MyViewModel中设置了对MyTempModel的引用一次以建立连线。 MyViewModel订阅MyTempModel中的属性更改事件,MyView使用数据绑定连接到MyViewModel。
模型 - >查看数据流摘要: MyModel在MyTempModel中设置属性,该属性触发事件。 MyViewModel的evenhandler获取更改并设置依赖项属性,导致MyView更新。
view - >模型数据流摘要: 对MyView的更改导致MyViewModel中的依赖项属性发生更改。此属性的setter将值推送到MyTempModel。当用户单击“确定”时,MyModel将复制MyTempModel中的值。
我对ViewModel的作用特别感兴趣。我记得保持对话“谦虚”是一件好事,也许这会让ViewModels变得谦虚。因此,您对视图模型与域模型的功能类型的评论将特别有趣。
我很欣赏这种模式的任何设计智慧。如果有人需要澄清,我很乐意更新这些信息。
答案 0 :(得分:0)
Alex给出的方向的替代方法是使viewmodel表示客户端和服务器端的内容。
,例如,显示的数字始终是用户输入的数字,数字的背景表示服务器已确认或未确认此号码(待定)。 viewmodel可以使用两个不同的属性来包含这些值,还可以使用status属性来指示属性已经同步的事实。
这样,viewmodel可以捕获所有用户需要知道的内容。所有视图需要做的是绑定到正确的属性以进行显示和编辑。
答案 1 :(得分:0)
我不认为使用代理类是件坏事。我有点担心这个:'MyModel在MyTempModel中设置属性,它触发一个事件。 MyViewModel的evenhandler获取更改并设置依赖项属性,导致MyView更新。我认为这会使您的Model类不那么通用,并且会使ViewModel中的功能变得模糊不清。我只是使用ViewModel来调解代理的交换,而不是让模型这样做。我还认为使用代理会为这种类型开放使用DataTemplates,这可以使UI更容易工作。