【发布时间】:2019-01-10 05:56:02
【问题描述】:
我试图更好地理解 MVVM 概念,但我正在努力解决模型和视图模型的关系。
我可以这样说:Model 不知道 ViewModel,因为 ViewModel 不知道 View?
如果我错了,请纠正我,考虑一个显示我们应该拥有的字符串的简单 WPF 应用程序:
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 可以持有一个传递思想的属性
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 是否只需要对 Model 属性有一些不同的意义才能在 UI 中显示它们?
抱歉,帖子太长了,希望有人能帮助我。
【问题讨论】:
-
这些都是好问题,但恐怕 SO 不是问这些问题的正确地方。你应该做更多的研究(你显然已经做了一些),如果你有更具体的问题,请回到这里。但是你知道,有很多库和框架可以解决这些 MVVM 问题,例如MVVM light 或 DevExpress.Mvvm.Free