【问题标题】:MVVM in C# WPF help me understand model and viewmodel relation [duplicate]C# WPF 中的 MVVM 帮助我理解模型和视图模型的关系 [重复]
【发布时间】: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

标签: c# wpf mvvm


【解决方案1】:

视图模型的作用是塑造、转换或操作数据。例如,这可能意味着提供更大列表的子集,从嵌套数据实体中展平某些属性或将数字/文本值转换为枚举。视图模型中不应存储视图特定信息(例如 SelectedIndex),视图相关信息应存储在视图后面代码的属性中(您仍然可以绑定到它)。

人们对 MVVM 的解释最大的错误是什么构成了“模型”——这是 Michael 在 his answer 中犯的一个错误。在 MVVM 中,模型是任何不是视图或视图模型的东西。数据类是模型的一部分,但不是 a 模型(与 MVC 或其他一些模式中的方式不同)。事实上,在 MVVM 中,您不应该将数据类称为“模型”,将它们称为 数据实体业务实体 在语义上更正确。如果您遵循 n 层架构,“模型”可以包含多个层。

澄清迈克尔的图表:

                    |    
View -> ViewModel ->| BL -> DAL -> Data Entities  
                    |  
                    | -> "the model"  
                    |

我之前的回答可能会有所帮助:In the MVVM design pattern, should models contain other models? - 它解释了这种方法,并有一个返回 MSDN 文档的参考链接。

【讨论】:

  • @MichaelPuckettII 哇,这里有点弹幕。去研究一些更多的架构模式,别忘了阅读我其他答案中的official MSDN doco I linked to。如果您不喜欢它,请与 Microsoft 合作。
  • @MichaelPuckettII 我说错了你的图表是View -> ViewModel -> DAL -> Model - DAL 是模型的一部分。这是一个常见的误解,在小型应用程序中并不重要,但在“模型”通常为多层的大型企业解决方案中却很重要。
  • @MichaelPuckettII 引用:“MVVM 中的模型是应用程序领域模型的实现,它包括数据模型以及业务和验证逻辑。模型对象的示例包括存储库、业务对象、数据传输对象 (DTO)、普通旧 CLR 对象 (POCO) 以及生成的实体和代理对象。"
猜你喜欢
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多