Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WPF中的MVVM帮助我理解模型和视图模型的关系_C#_Wpf_Mvvm - Fatal编程技术网

C#WPF中的MVVM帮助我理解模型和视图模型的关系

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

我试图更好地理解MVVM的概念,我正在努力处理模型和视图模型的关系

我可以这样说吗:模型不知道视图模型,正如视图模型不知道视图一样

如果我错了,请纠正我的错误,考虑一个简单的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可以保存一个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"  
                    |