基于MSDN的图片
似乎所有数据和业务逻辑都应该位于模型中,其中View Model应具有模型的一组重复属性以用于显示目的。 View应绑定到ViewModel中的重复属性,而不是直接绑定到Models内的属性。
ViewModel应该实现INotifyPropertyChanged
接口,让View知道某些属性是否已更改。
但是Model应该如何通知ViewModel有关更改?它是否应该实施INotifyPropertyChanged
?如果是这样,那么我们就可以直接将View绑定到Model' s属性。什么是在中间有一个额外的层的真正好处,我们必须手动处理所有数据更改通知?
基于我的理解的例子:
视图:
<Grid>
<TextBlock Text="{Binding foo}"/>
<Label Content="{Binding bar}"/>
</Grid>
查看型号:
class ViewModel : INotifyPropertyChanged
{
Model _m;
public ViewModel(Model m)
{
_m = m;
}
public string foo
{
get
{
return _m.foo;
}
set
{
_m.UpdateFoo(value);
//This one works fine. xaml will call getter to get the dead beef version
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("foo"));
}
}
public string bar
{
get
{
return _m.bar;
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
型号:
class Model
{
public string foo { get; private set; }
public string bar { get; private set; }
public void UpdateFoo(string newVal)
{
foo = newVal + "dead beef";
bar = newVal; //how do i tell ViewModel that i have changed?
}
}
答案 0 :(得分:1)
通知可以来自模型@GeneratedValue
;但实际上,界面可怕可以手动使用。必须根据已更改属性的名称建立逻辑基础并不好玩。
带有通知的模型层可能类似于消息总线客户端,因为它会在消息中解析它并将相关(和强类型)事件发送到视图模型。然后,视图模型更新其引发PropertyChanged的数据对象的属性。
更大的问题:您是否必须拥有单独的ViewModel和Model数据对象?
如果你想成为一个纯粹主义者,当然;复制你的对象。如果您需要合理的方法,只需要添加特殊的视图模型对象,如果您需要添加不适合(或者只是不存在)模型对象的属性。
模型更多的是关注点的分离而不是无用的重复对象集。在前面的示例中,ViewModel应该不关心对象或事件来自消息总线,它只知道如何为视图设置对象。该模型处理作为消息总线客户端的实现细节。