C#WPF中的MVVM帮助我理解模型和视图模型的关系
我试图更好地理解MVVM的概念,我正在努力处理模型和视图模型的关系 我可以这样说吗:模型不知道视图模型,正如视图模型不知道视图一样 如果我错了,请纠正我的错误,考虑一个简单的WPF应用程序,它显示一些我们应该具有的字符串:C#WPF中的MVVM帮助我理解模型和视图模型的关系,c#,wpf,mvvm,C#,Wpf,Mvvm,我试图更好地理解MVVM的概念,我正在努力处理模型和视图模型的关系 我可以这样说吗:模型不知道视图模型,正如视图模型不知道视图一样 如果我错了,请纠正我的错误,考虑一个简单的WPF应用程序,它显示一些我们应该具有的字符串: View: XAML TextBlock bound to string property text1 XAML.CS instantiates ViewModel vModel ViewModel: has property text1
View: XAML TextBlock bound to string property text1
XAML.CS instantiates ViewModel vModel
ViewModel: has property text1
implements INotifyPropertyChanged notifying View of its changes
instantiates Model mModel
Model: has property string text1
?? implements INotifyPropertyChanged notifying ViewModel of its changes ??
在这里,我对最后一部分感到困惑。如果整个逻辑都发生在模型中,例如字符串操作,那么如何在ViewModel中处理来自模型的通知
ViewModel_PropertyChanged是否可以通过属性名称访问和更改其属性值?我不是说:
if (e.PropertyName == "text1")
因为如果我们有很多房产,那将是一场噩梦
假设属性在Model和ViewModel中具有相同的名称,我们可以执行以下操作:
// Model PropertyChanged Handler
private void mainModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
NotifyPropertyChanged(e.PropertyName);
}
// ViewModel PropertyChanged Notifier
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
然后ViewModel可以保存一个pass-think属性
public string text1
{
get { return mModel.text1; }
set { }
}
但这是正确的吗?如果我们需要从UI更改此属性,该怎么办
public string text1
{
get { return mModel.text1; }
set
{
if (mModel.text1 != value)
{
mModel.text1 = value;
NotifyPropertyChanged("text1"); // ??
}
}
}
mModel.text1=值;-这将通知包括UI在内的所有人它所做的更改
NotifyPropertyChanged(“text1”);/?-这将重复此通知
如果ViewModel仅包含此传递属性,则需要它做什么?ViewModel是否只需要对模型属性进行一些不同的理解就可以在UI中显示它们
很抱歉这篇博文太多,希望有人能帮助我。viewmodel的作用是塑造、转换或操作数据。例如,这可能意味着提供更大列表的子集,从嵌套数据实体中展平某些属性,或将数字/文本值转换为枚举。viewmodel中不应存储视图特定的信息(例如SelectedIndex),视图相关信息应存储在视图代码隐藏的属性中(您仍然可以绑定到它) 人们对MVVM的理解中最大的错误是什么构成了“模型”——这是Michael在年犯的一个错误。在MVVM中,模型是任何不是视图或视图模型的东西。数据类是模型的一部分,但不是模型(与MVC或其他模式不同)。事实上,在MVVM中,您不应该将数据类称为“模型”,从语义上讲,将它们称为数据实体或业务实体更为正确。如果遵循n层体系结构,“模型”可以包含多个层 为了澄清Michael的图表:
我前面的回答可能会有所帮助:-它解释了这种方法,并有一个指向MSDN doco的参考链接。这些都是好问题,但我担心这样问不合适。你应该做更多的研究(你显然已经做了一些),如果你有更具体的问题,请回到这里。但正如您所知,有很多库和框架可以解决这些MVVM问题,例如MVVM light或DevExpress.MVVM。Free@MichaelPuckettII哇,那里有点乱。去研究更多的架构模式,别忘了阅读我另一个答案中的。如果你不喜欢它,那就向微软咨询。@MichaelPuckettII我说你的图表错了,它是
视图->视图模型->DAL->Model
之一-DAL是模型的一部分。这是一个常见的误解,在小型应用程序中并不重要,但在大型企业解决方案中却非常重要,因为“模型”通常是多层的。@MichaelPuckettII引述:“MVVM中的模型是应用程序域模型的实现,其中包括数据模型以及业务和验证逻辑。模型对象的示例包括存储库、业务对象、数据传输对象(DTO)、普通旧CLR对象(POCO)以及生成的实体和代理对象。”
|
View -> ViewModel ->| BL -> DAL -> Data Entities
|
| -> "the model"
|