【问题标题】:Mvvm model ViewModelMvvm 模型 ViewModel
【发布时间】:2019-08-12 17:26:27
【问题描述】:

是否可以命名为MVVM模型?因为 View 通过 视图模型数据。 View 是否应该只与 ViewModelData 交互?我确实在某处读到正确的 MVVM 模型应该在 ViewModel 中而不是在 Model 中实现 INotify。对吗?

namespace WpfApplication135
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModelData();
    }
}
public class ViewModelData
{
    public DataModel DM { get; set; }
    public ViewModelData()
    {
        DM = new DataModel();
    }
}
public class DataModel : INotifyPropertyChanged
{
    public int label;
    public int Label
    {
        get
        {
            return label;
        }

        set
        {
            label = value;
            RaisePropertyChanged("Label");
        }
    }
    public DataModel()
    {
        Action Update = new Action(Run);
        IAsyncResult result = Update.BeginInvoke(null, null);
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string info)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
    public void Run()
    {
        int i=0;
        while(true)
        {
            System.Threading.Thread.Sleep(2000);
            Label = ++i;
        }
    }
}
}

xaml

    <Grid>
    <Label Content="{Binding DM.Label}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>

</Grid>

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    MVVM 最初的想法确实是 View 不应该知道(不依赖于)Model。

    实际上,这意味着在 ViewModel 中重新实现所有这些 Model 属性(请参见下图中的浅黄色框),需要大量工作。当您的模型可以轻松实现 INPC 时,例如当它是从数据库模式生成时,会更加痛苦。数据库优先模式下的实体框架允许您通过 T4 模板注入 INPC 代码。

    很快达成共识,可以转发ViewModel.Model 属性并绑定到该属性,就像您的DM 属性一样。请参见图中的浅蓝色框。

    这个问题在这张图片中很形象化,注意右上角的大量箭头。它们描述了数据绑定的各种解决方案,您可以使用它们的任意组合。

    【讨论】:

    • 在上图中,xaml 同时绑定到 ViewModel 和 Model,还是这些绑定相互排斥?图没有具体说明。如果它们都可以同时绑定,你是如何实现的?
    • 我在任何地方都看不到我刚才提出的问题。我知道您可以绑定到 ViewModel 并且我知道您可以绑定到 Model,但我不知道如何同时绑定到两者,因为我总是在代码隐藏中设置 BindingContext 并且我没有办法知道同时将 BindingContext 设置为两个不同的源。我可能应该在另一篇文章中问这个问题。
    【解决方案2】:

    MVVM 的一点是您的视图不应该知道您的数据模型,反之亦然。这就是为什么有一个 ViewModel。现在,您的 ViewModel 是浪费的代码。它什么也不做。

    您可能需要更多地阅读 MVVM,因为此处的问答格式对它的解释过于宽泛。

    【讨论】:

    • 此外,属性更改通知的概念并不特定于视图/视图-模型关系,在很多情况下它也有助于模型支持 IPCN。可以通过在运行时将代理注入到您的存储库(请参阅Castle Dynamic Proxy)或在编译时使用后处理步骤修改 IL 本身(请参阅Fody)来自动将其添加到您的 DAL 实体中。
    猜你喜欢
    • 2011-08-14
    • 2013-12-09
    • 2015-08-24
    • 2016-07-17
    • 2016-08-23
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多