我将尝试通过一个简单的示例来提供一些背景信息。
请注意,下面的所有代码都只是概念性的,写在这里而不是在 VS 中。
将您的 ViewModel 视为模型的包装器。
您的模型由属性公开,因此您可以绑定到它或从视图中绑定到它的属性。
你的视图模型:
public class SomeEntityViewModel : NotificationObject
{
private SomeEntity _someEntity;
public SomeEntity SomeEntity
{
get{ return _someEntity;}
set
{
_someEntity = value;
RaisePropertyChanged("SomeEntity");
}
}
}
现在假设您向服务器发送请求并等待响应。
我们还假设您有一个更高的对象(如父 ViewModel)来启动您的 VM:
public class SomeEntityContainerViewModel : NotificationObject
{
public ObservableCollection<SomeEntityViewModel> Items;
public void async OnRequestNewEntity()
{
SomeEntity newEntity = await _someEntityService.CreateSomeEntityAsync();
var vm = new SomeEntityViewModel{ SomeEntity = newEntity};
Items.add(vm);
}
}
您的 SomeEntityContainerView 其中 SomeEntityContainerViewModel 是 DataContext :
<UserControl>
<Button Command="{Binding RequestNewEntityCommand}" />
<ItemsControl ItemsSource="{Binding Items}" />
</UserControl>
您的 SomeEntityView 其中 SomeEntityViewModel 是 DataContext :
<UserControl>
<TextBlock Text="{Binding SomeEntity.Name}" />
</UserControl>
最简单的设计:
您的模型需要“哑”,只有数据。
您的 ViewModel 是最接近 Controller 的等价物,它将处理逻辑,它是将您的模型包装(不转换)到视图模型中的组件。
在上面的示例中,我们有一些更高的对象,一个父 ViewModel,它启动我们的 ViewModel。
这相当于一个控制器的作用域,它在 DOM 中具有其他嵌套的控制器。