我经历过的大多数MVVM示例都使用了Model实现INotifyPropertyChanged,但在Josh Smith的CommandSink示例中 ,ViewModel实现了INotifyPropertyChanged.
我还在认知上把MVVM概念放在一起,所以我不知道是否:
您曾参与MVVM项目的其他经历是什么?
我很迷惑.也许你可以帮帮我:)
我一直在遵循CAG的指导,发现MVP模式对我来说非常自然.假设我有一个支持UI的模型(例如:实现INotifyPropertyChanged),我使用演示者将此模型绑定到视图(演示者知道视图的接口),保持我的Code-Behind尽可能小只处理Bindings(模型和命令)属性(或方法)或没有ICommand的控件的事件,在这种情况下立即委托给演示者.
过了一会儿,我发现了MVVM模式,到目前为止它还没有找到我.据我所知,只有当我的模型不支持UI时,我才会使用MVVM.但是保持演示者并使用新模型更合理,我无法理解这种用法会让我失去什么.我知道我错过了什么,但它是什么:).
此外,当您的View是通用的并且可以处理多种模型时(例如在PropertyGrid中).建议将ViewModel与DataTemplate一起使用,但在这种情况下,您无法为模型中的每个实体创建模板,只需要在运行时进行调查,您会建议什么?
在观看Josh Smith在屏幕录像中谈论MVVM时,我感觉到ViewModel中模型的重新暴露违反了DRY(不要重复自己),这真的是不可避免的吗?令人惊讶的是,与ADO.Net动态数据元数据类的火焰相比,他现在没有人在争论它.
希望它足够清楚
谢谢
阿里尔
下面的代码是我以前的MVVM方法的重构(Fat Models,瘦的ViewModels和dumb Views,最好的MVVM方法?),我将逻辑和INotifyPropertyChanged实现从模型中移回ViewModel.这更有意义,因为正如所指出的,您经常必须使用您无法更改或不想更改的模型,因此您的MVVM方法应该能够使用任何模型类,因为它碰巧存在.
此示例仍允许您在Visual Studio和Expression Blend中以设计模式查看模型中的实时数据,我认为这很重要,因为您可以拥有设计器连接的模拟数据存储,例如最小和最大的字符串. UI可能会遇到,以便他可以根据这些极端情况调整设计.
问题:
如果您只是将XAML和代码复制到新的WPF项目中,则以下代码将起作用.
XAML:
<Window x:Class="TestMvvm73892.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestMvvm73892"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<ObjectDataProvider
x:Key="DataSourceCustomer"
ObjectType="{x:Type local:CustomerViewModel}"
MethodName="GetCustomerViewModel"/>
</Window.Resources>
<DockPanel DataContext="{StaticResource DataSourceCustomer}">
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
<TextBlock Text="{Binding Path=FirstName}"/>
<TextBlock Text=" "/>
<TextBlock Text="{Binding Path=LastName}"/>
</StackPanel>
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
<TextBlock Text="{Binding Path=TimeOfMostRecentActivity}"/>
</StackPanel>
</DockPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
代码背后:
using System;
using System.Windows;
using System.ComponentModel;
using System.Threading;
namespace TestMvvm73892
{
public partial class Window1 …Run Code Online (Sandbox Code Playgroud)